中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C預(yù)編譯命令,C++預(yù)編譯命令,C宏定義,C++宏定義

(一)基本知識(shí)   

    預(yù)處理器指示符以“#”號(hào)開(kāi)頭標(biāo)識(shí),處理這些指示符的程序叫做預(yù)處理器。

    #include指示符讀入指定文件的內(nèi)容,它有兩種格式:

        #include <some_file.h>

        #include "my_file.h"

    如果文件名用<>括起來(lái),表明這個(gè)文件是一個(gè)工程或標(biāo)準(zhǔn)頭文件,查找過(guò)程會(huì)先檢查預(yù)定義的目錄,我

們可以通過(guò)設(shè)置環(huán)境變量或命令行來(lái)修改這些目錄。如果文件名用“”引起來(lái),則表明該文件是用戶提供的

頭文件,查找該文件時(shí)將從當(dāng)前文件所在目錄開(kāi)始。

    由于頭文件的嵌套關(guān)系,一個(gè)頭文件可能會(huì)被再次包含,條件指示符可防止這種頭文件的重復(fù)處理,例

如:

       #ifndef BOOKSTORE_H

        #define BOOKSTORE_H

           //bookstore.h的內(nèi)容

       #endif

    #ifndef指明,如果某個(gè)宏未被定義,要怎么處理

    #ifdef指明,如果某個(gè)宏已被定義,要怎么處理。

比如:

    int main(){

    #ifdef DEBUG

        cout<<"begining execution of main\n";

    #endif

       string word="hello world!";

       cout<<world<<endl;

    }

    本例中,如果未定義DEBUG,實(shí)際被編譯的代碼如下:

    int main(){

       string word="hello world!";

       cout<<world<<endl;

    }

    如果已定義DEBUG,則傳給編譯器的程序代碼為:

    int main(){

        cout<<"begining execution of main\n";

       string word="hello world!";

       cout<<world<<endl;

    }

    我們?cè)诰幾g程序時(shí)可以使用-D選項(xiàng),并且在后面寫上預(yù)處理器常量的名字,這樣就能在命令行中定義預(yù)

處理器常:

    $CC -DDEBUG main.c

    也可以在程序中用#define指示符定義預(yù)處理器常量。

(二)自動(dòng)定義的預(yù)處理器名字

    編譯C++程序時(shí),編譯器自動(dòng)定義了一個(gè)預(yù)處理器名字__cplusplus(前面是兩個(gè)下劃線)。因此,我們可

以根據(jù)它來(lái)判斷該程序是否是 C++ 程序,以便有條件的包含一些代碼。如

    #ifdef __cplusplus

         extern "C"

    #endif

    int min( int, int );

    在編譯標(biāo)準(zhǔn) C 時(shí),編譯器將自動(dòng)定義__STDC__.

    其他一些比較常用的預(yù)定義名字是:

        __LINE__ :文件被編譯的行數(shù)

        __FILE__ :被編譯的文件的名字

        __TIME__ :當(dāng)前被編譯文件的編譯時(shí)間

        __DATE__ :當(dāng)前被編譯文件的編譯日期

    另外, C99新增了 __func__ 指示被編譯的函數(shù)的名字,對(duì)于gcc,與__func__等價(jià)的名字為

__FUNCTION__ .

    上述預(yù)定義的名字對(duì)寫trace有很大的幫助,比如:

    if (i==0)

        cerr<<"error:"<<__FILE__<<":line:"<<__LINE<<":func"<<__func__<<"i must be non-zero\n";

(三)C與C++的頭文件

    C庫(kù)文件的C++名字總是以字母C開(kāi)頭,后面是去掉后綴.h的C名字,如assert():如果使用C++的頭文件則

為cassert,C則為assert.h,所以使用頭文件的C名字或C++名字,方法也不相同。仍以assert為例:

    C++: #include <cassert>

         using namespace std;

    C:   #include <assert.h>

(四)宏替換

    在 ISO C 之前,從未詳細(xì)描述宏替換進(jìn)程。這種不明確性產(chǎn)生很多有分歧的實(shí)現(xiàn)。依賴于比明顯常量

替換和簡(jiǎn)單類函數(shù)宏更奇特的事情的任何代碼可能并不真正可移植。此外,ISO C 宏替換算法可以完成在舊 

C 版本中無(wú)法完成的工作。例如:

    #define name (*name)

    使 name 的任何使用均替換為通過(guò) name 進(jìn)行的間接引用。舊 C 預(yù)處理程序會(huì)產(chǎn)生大量

圓括號(hào)和星號(hào),并最終產(chǎn)生關(guān)于宏遞歸的錯(cuò)誤。

    ISO C 對(duì)宏替換方法的主要更改是要求宏參數(shù),而不是要求那些本身是宏替換操作符 # 和 ## 的操作

數(shù)并且在替換標(biāo)記列表中替換之前要遞歸擴(kuò)展的參數(shù)。然而,這種更改很少在結(jié)果標(biāo)記中產(chǎn)生實(shí)際差異。

    比如,使用 # 宏替換操作符和字符串文字并置

        #define str(a) #a "!"

        str(x y)

    以上代碼生成兩個(gè)字符串文字 "x y" 和 "!",它們?cè)诓⒅煤笊上嗤?"x y!"

    對(duì)于可變參數(shù)的宏,gnuc與sun cc相同的處理方式如下:

    #define identifier (...) replacement_list

    #define identifier (identifier_list, ...) replacement_list

    如果列出的宏參數(shù)以省略號(hào)結(jié)尾,那么該宏的調(diào)用允許使用除了宏參數(shù)以外的其他更多參數(shù)。附加參數(shù)

被收集在一個(gè)單獨(dú)的字符串中,該字符串可以包括逗號(hào)??梢允褂煤晏鎿Q列表中的名稱 __VA_ARGS__ 來(lái)引

用這些附加參數(shù)(replacement_list的可變參數(shù)用__VA_ARGS__替換).

    而對(duì)于 gnu c 來(lái)說(shuō),還有一種方式,使用##args來(lái)引用(replacement_list的可變參數(shù)為##args),具

體的定義方式也有所不同:

    #define identifier (args...) replacement_list

    #define identifier (identifier_list, args...) replacement_list

(五)宏中"#"和"##"的用法

I、一般用法

我們使用#把宏參數(shù)變?yōu)橐粋€(gè)字符串,用##把兩個(gè)宏參數(shù)貼合在一起.

用法:

#include<cstdio>

#include<climits>

using namespace std;

#define STR(s)     #s

#define CONS(a,b) int(a##e##b)

int main()

{

    printf(STR(vck));           // 輸出字符串"vck"

    printf("%d\n", CONS(2,3)); // 2e3 輸出:2000

    return 0;

}

II、當(dāng)宏參數(shù)是另一個(gè)宏的時(shí)候

需要注意的是凡宏定義里有用'#'或'##'的地方宏參數(shù)是不會(huì)再展開(kāi).

1, 非'#'和'##'的情況

#define TOW      (2)

#define MUL(a,b) (a*b)

printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));

這行的宏會(huì)被展開(kāi)為:

printf("%d*%d=%d\n", (2), (2), ((2)*(2)));

MUL里的參數(shù)TOW會(huì)被展開(kāi)為(2).

2, 當(dāng)有'#'或'##'的時(shí)候

#define A          (2)

#define STR(s)     #s

#define CONS(a,b) int(a##e##b)

printf("int max: %s\n", STR(INT_MAX));    // INT_MAX #i nclude<climits>

這行會(huì)被展開(kāi)為:

printf("int max: %s\n", "INT_MAX");

printf("%s\n", CONS(A, A));               // compile error

這一行則是:

printf("%s\n", int(AeA));

INT_MAX和A都不會(huì)再被展開(kāi), 然而解決這個(gè)問(wèn)題的方法很簡(jiǎn)單. 加多一層中間轉(zhuǎn)換宏.

加這層宏的用意是把所有宏的參數(shù)在這層里全部展開(kāi), 那么在轉(zhuǎn)換宏里的那一個(gè)宏(_STR)就能得到正確的宏

參數(shù).

#define A           (2)

#define _STR(s)     #s

#define STR(s)      _STR(s)          // 轉(zhuǎn)換宏

#define _CONS(a,b) int(a##e##b)

#define CONS(a,b)   _CONS(a,b)       // 轉(zhuǎn)換宏

printf("int max: %s\n", STR(INT_MAX));          // INT_MAX,int型的最大值,為一個(gè)變量 

#include<climits>

輸出為: int max: 0x7fffffff

STR(INT_MAX) --> _STR(0x7fffffff) 然后再轉(zhuǎn)換成字符串;

printf("%d\n", CONS(A, A));

輸出為:200

CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))

III、'#'和'##'的一些應(yīng)用特例

1、合并匿名變量名

#define ___ANONYMOUS1(type, var, line) type var##line

#define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line)

#define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__)

例:ANONYMOUS(static int); 即: static int _anonymous70; 70表示該行行號(hào);

第一層:ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__);

第二層:                        --> ___ANONYMOUS1(static int, _anonymous, 70);

第三層:                        --> static int _anonymous70;

即每次只能解開(kāi)當(dāng)前層的宏,所以__LINE__在第二層才能被解開(kāi);

2、填充結(jié)構(gòu)

#define FILL(a)   {a, #a}

enum IDD{OPEN, CLOSE};

typedef struct MSG{

IDD id;

const char * msg;

}MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};

相當(dāng)于:

MSG _msg[] = {{OPEN, "OPEN"},

              {CLOSE, "CLOSE"}};

3、記錄文件名

#define _GET_FILE_NAME(f)   #f

#define GET_FILE_NAME(f)    _GET_FILE_NAME(f)

static char FILE_NAME[] = GET_FILE_NAME(__FILE__);

4、得到一個(gè)數(shù)值類型所對(duì)應(yīng)的字符串緩沖大小

#define _TYPE_BUF_SIZE(type) sizeof #type

#define TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type)

char buf[TYPE_BUF_SIZE(INT_MAX)];

     --> char buf[_TYPE_BUF_SIZE(0x7fffffff)];

     --> char buf[sizeof "0x7fffffff"];

這里相當(dāng)于:

char buf[11];

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C宏定義的簡(jiǎn)單總結(jié)
宏定義有無(wú)參數(shù)宏定義和帶參數(shù)宏定義兩種
C語(yǔ)言中“#”和"##"的用法
[收藏] 宏工作原理以及典型面試10問(wèn)
C語(yǔ)言的那些小秘密之預(yù)處理
計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)第6章 編譯預(yù)處理
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服