(一)基本知識(shí)
們可以通過(guò)設(shè)置環(huán)境變量或命令行來(lái)修改這些目錄。如果文件名用“”引起來(lái),則表明該文件是用戶提供的
頭文件,查找該文件時(shí)將從當(dāng)前文件所在目錄開(kāi)始。
如:
比如:
處理器常:
(二)自動(dòng)定義的預(yù)處理器名字
以根據(jù)它來(lái)判斷該程序是否是 C++ 程序,以便有條件的包含一些代碼。如
__FUNCTION__ .
(三)C與C++的頭文件
為cassert,C則為assert.h,所以使用頭文件的C名字或C++名字,方法也不相同。仍以assert為例:
(四)宏替換
替換和簡(jiǎn)單類函數(shù)宏更奇特的事情的任何代碼可能并不真正可移植。此外,ISO C 宏替換算法可以完成在舊
C 版本中無(wú)法完成的工作。例如:
圓括號(hào)和星號(hào),并最終產(chǎn)生關(guān)于宏遞歸的錯(cuò)誤。
數(shù)并且在替換標(biāo)記列表中替換之前要遞歸擴(kuò)展的參數(shù)。然而,這種更改很少在結(jié)果標(biāo)記中產(chǎn)生實(shí)際差異。
被收集在一個(gè)單獨(dú)的字符串中,該字符串可以包括逗號(hào)??梢允褂煤晏鎿Q列表中的名稱 __VA_ARGS__ 來(lái)引
用這些附加參數(shù)(replacement_list的可變參數(shù)用__VA_ARGS__替換).
體的定義方式也有所不同:
(五)宏中"#"和"##"的用法
I、一般用法
我們使用#把宏參數(shù)變?yōu)橐粋€(gè)字符串,用##把兩個(gè)宏參數(shù)貼合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s)
#define CONS(a,b) int(a##e##b)
int main()
{
}
II、當(dāng)宏參數(shù)是另一個(gè)宏的時(shí)候
需要注意的是凡宏定義里有用'#'或'##'的地方宏參數(shù)是不會(huì)再展開(kāi).
1, 非'#'和'##'的情況
#define TOW
#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
#define STR(s)
#define CONS(a,b) int(a##e##b)
printf("int max: %s\n", STR(INT_MAX));
這行會(huì)被展開(kāi)為:
printf("int max: %s\n", "INT_MAX");
printf("%s\n", CONS(A, A));
這一行則是:
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
#define _STR(s)
#define STR(s)
#define _CONS(a,b) int(a##e##b)
#define CONS(a,b)
printf("int max: %s\n", STR(INT_MAX));
#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__);
第二層:
第三層:
即每次只能解開(kāi)當(dāng)前層的宏,所以__LINE__在第二層才能被解開(kāi);
2、填充結(jié)構(gòu)
#define FILL(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"},
3、記錄文件名
#define _GET_FILE_NAME(f)
#define 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)
char buf[TYPE_BUF_SIZE(INT_MAX)];
這里相當(dāng)于:
char buf[11];
聯(lián)系客服