亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言超全面define預處理指令的使用說明

 更新時間:2022年04月22日 10:35:55   作者:耀 星  
C語言里可以用#define定義一個標識符來表示一個常量。特點是:定義的標識符不占內存,只是一個臨時的符號,預編譯后這個符號就不存在了,也不做類型定義。預編譯又叫預處理

前言

C語言中源代碼到可執(zhí)行文件的第一階段,也就是預處理階段,會檢查源文件中的預處理指令語句和宏定義,并對源代碼進行相應的替換,預處理過程還會刪除程序中的注釋和多余的空白符號。

預處理指令是以#開頭的代碼行,#必須是該行除了空白符外的第一個字符,#后是指令關鍵字,在#和指令關鍵字之間允許存在若干個空白字符,define是宏定義命令。在C語言程序中允許用一個標識符來表示一個字符串,稱為“宏”,“宏”又分為有參和無參,有參又稱為“宏函數(shù)”,被定義為“宏”的標識符稱為“宏名”。

#define 定義宏(無參)

語法規(guī)定:

#define name stuff
name:標識符名\宏名
stuff:可以是關鍵字、常量、關鍵字、標識符、標點符號、運算符,表達式

在預處理階段,編譯器會在程序中使用#define定義的標識符替換成stuff,可以通過預處理生成的.i文件查看效果。

//stuff是數(shù)值常量
#define NUM 10

//stuff是關鍵字
#define reg register

//stuff是標點符號
#define GREATER_THAN >

//stuff的更多表達方式
#define do_forever for(;;)
//若定義的stuff過長,可以分成幾行寫,除了最后一行外,每行的后面都加一個\(續(xù)行符)
#define DBBUG_PRINT printf("file:%s\tline:%d\t \
                    date:%s\ttime:%s\n",\
                    __FILE__,__LINE__,\
                    __DATE__,__TIME__)

總結:#define定義的name(宏名),在預編譯階段會將所有的宏名替換成stuff,stuff內容被替換到源代碼中。稱為“宏代換”或“宏展開”。

注意:define定義的標識符的時候,后面加上“;”會將“;”認為是stuff中的內容。

#define 定義宏函數(shù)

宏函數(shù)的申明方式:#define name(parament-list) stuff
parament-list:參數(shù)列表

 注意:參數(shù)列表的左括號必須與name緊鄰,如果兩者之間有空白存在,參數(shù)列表就會被解釋為stuff的部分。

宏函數(shù)存在的問題1

#include <stdio.h>
#define SQUARE(x) x*x//定義一個宏函數(shù)求平方
int main()
{
    int x = SQUARE(3+1);//替換后x的計算結果是多少?答案是:7
 
}

 為什么呢?

在給宏函數(shù)傳參時,如果傳遞的是一個表達式,不會先計算表達式的結果再進行傳參,而是直接將表達式整體作為參數(shù)傳遞。

那么如何防止發(fā)生這樣的情況呢?+()

 宏函數(shù)存在的問題2

#include <stdio.h>
#define SUM(x,y) (x)+(y)
int main()
{
    int a = 10;
    int b = 5;
    int c = SUM(a,b)*2;//替換后c的結果為20,why
    return 0;
}

我們看看替換后的結果

 這又該如何解決呢?

 總結:在對數(shù)值表達式進行求值的宏定義應該用這兩種方式加上括號,避免在使用宏參數(shù)的操作符或鄰近操作符之間不可預料的相互作用。 

 #define替換規(guī)則:

1.在使用宏函數(shù)時,首先對參數(shù)進行檢查,看看參數(shù)中是否包含任何#define定義的標識符,如果有,他們首先被替換。

2.替換的內容被插入到源文件原來的位置。對于宏函數(shù),參數(shù)名被他們的值替換

宏的更多規(guī)則特性

1.宏名一般用大寫

2.使用宏可提高程序的通用性和易讀性,便于修改。

3.宏定義末尾不加分號

4.宏定義寫在函數(shù)的大括號外面,作用域為其后的程序,通常放在開頭

5.宏函數(shù)不可遞歸

6.宏定義不分配內存,變量定義分配內存

7.字符串" "中永遠不包含宏

8.宏定義不存在類型問題,他的參數(shù)也沒有類型

宏的缺點

1.宏不能調試

2.宏由于與類型無關,不夠嚴謹

3.宏可能帶來運算符優(yōu)先級的問題,導致容易出錯

常見預處理指令

#define:宏定義

#undef:撤銷已經(jīng)定義過的宏名

#include:將另一個源文件嵌入到#include源文件中

#if~#endif:如果#if后面的常量表達式為真,則編譯#if~#endif之間的代碼,如果為假,跳過這些代碼不編譯。

#if~#elif~#else~#endif:和if~else if~else類似,可以建立更分支。

#ifdef symbol~endif:判斷是否被定義,定義了編譯他們之間內容

#ifndef symbol~endif:判斷是否被定義,沒定義編譯他們之間的內容

#line:改變當前行數(shù)和文件名稱,是在編譯程序中預先定義的標識符命令的基本形式:#line number["filename"]

#error:編譯程序時,只要遇到#error就會生成一個編譯錯誤的提示信息,并停止編譯。

#pragma: 可以設定編譯程序完成一些特點的動作(可以通過編譯程序的菜單中設置),可以向編譯程序傳送各種指令。

到此這篇關于C語言超全面define預處理指令的使用說明的文章就介紹到這了,更多相關C語言define內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++元編程語言初步入門詳解

    C++元編程語言初步入門詳解

    這篇文章主要為大家介紹了C++元編程語言初步入門的詳解示例,文中包含詳細的基本概念及運用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • C++中set的用法學習

    C++中set的用法學習

    Set是C++?STL(標準模板庫)的一個容器類,它用于存儲不同的值,并且可以按照特定順序進行訪問和操作。本文就來通過一些示例和大家簡單講講set的用法吧
    2023-05-05
  • 詳解如何利用C++實現(xiàn)Mystring類

    詳解如何利用C++實現(xiàn)Mystring類

    這篇文章主要為大家詳細介紹了C++實現(xiàn)MyString的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 利用Matlab繪制優(yōu)美的k線圖

    利用Matlab繪制優(yōu)美的k線圖

    本期又是一個花里胡哨的數(shù)據(jù)可視化,前兩天刷到了耐克的視覺設計師Gladys Orteza繪制的k線圖作品,把沉悶的股票圖變成了精彩的風景,但是那些大部分是真的完全看不清,我這里挑選了幾個能看清的k線圖風格將其用MATLAB進行了實現(xiàn)
    2022-10-10
  • C語言實例講解選擇語句的使用

    C語言實例講解選擇語句的使用

    選擇語句是C語言中的重要組成部分,該部分也比較基礎,本文將通過最通俗易懂的方式來為大家做出講解。相信通過本文的學習,讓大家一舉拿下C語言選擇語句的知識點
    2022-05-05
  • VC6.0常見編譯錯誤提示附解決方法

    VC6.0常見編譯錯誤提示附解決方法

    這篇文章主要介紹了VC++6.0編譯過程中常遇到的一些錯誤提示并給出了錯誤原因與分析,需要的朋友尅參考下
    2013-07-07
  • vscode分享代碼插件Polacode介紹

    vscode分享代碼插件Polacode介紹

    這篇文章主要介紹了vscode分享代碼插件Polacode的相關知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法

    自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法

    本篇文章介紹了,自己實現(xiàn)strcpy函數(shù)的實現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • 詳解C++中多態(tài)的底層原理

    詳解C++中多態(tài)的底層原理

    要了解C++多態(tài)的底層原理需要我們對C指針有著深入的了解,這個在打印虛表的時候就可以見功底,所以快來跟隨小編一起學習一下吧
    2022-04-04
  • C語言簡析指針用途

    C語言簡析指針用途

    C語言這門課程在計算機的基礎教學中一直占有比較重要的地位,然而要想突破C語言的學習,對指針的掌握是非常重要的,本文將具體針對指針的基礎做詳盡的介紹
    2022-07-07

最新評論