1. 預處理器:
1.1 使用#代表返回乙個帶引號的字串,如:
#define to_string(s) #s
to_string(hello); 可以表示成"hello"
1.2 使用##代表連線前後的內容,如:
#define concatenate( x, y ) x##y
concatenate(5,2);可以表示成52
1.3 #if, #ifdef, #ifndef, #else, #elif, #endif ,#if defined,!defined均可以
1.4 #line
#line命令用於更改__line__和__file__的值,而這兩個值一般用於除錯輸出資訊,如輸出出錯的行和檔案資訊
如果使用預設的__line__,則直接取用即可,不用使用#line進行更改,如assert的實現中會使用這兩個值,另外__file__取用的不是unicode型別,可以
使用巨集_crt_wide(__file__)進行轉換,巨集_crt_wide內部即在前面加了個l進行轉換,也可以自己寫巨集,如:
#define test2(_string) l ## _string
#define test1(_string) test2(_string)
strshow.format(l"the line is :%d, filename is: %s", __line__, test1(__file__));
1.5 #pragma
比較複雜,功能強大,如可以用於消除編譯器警告:
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊
#pragma warning(once:4385) // 4385號警告資訊僅報告一次
#pragma warning(error:164) // 把164號警告資訊作為乙個錯誤。
另如:#pragma once 編譯一次
#pragma warning(push)// 儲存當前編譯器警告級別。這樣在下面設定了disable警告級別後,再在最下面恢復警告級別。防止影響其它**的警告資訊
#pragma warning(disable: 4702)
#pragma warning(pop)
#pragma comment(lib, "hcnetsdk.lib"); //載入lib庫
//設定共享資料段
#pragma data_seg( "shared ")
hhook g_hhook = null;
dword g_dwthreadiddips = 0;
#pragma data_seg()
1.6 #undef
取消前面#define的乙個值
1.7
__line__ 和 __file__ 變數表示正在處理的當前行和當前檔案.
__date__ 變數表示當前日期,格式為month/day/year(月/日/年).
__time__ 變數描述當前的時間,格式為hour:minute:second(時:分:秒).
_cplusplus 變數只在編譯乙個c++程式時定義.
__stdc__ 變數在編譯乙個c程式時定義,編譯c++時也有可能定義.
strdataandtime.format(l"date:%s,time:%s", _crt_wide(__date__), _crt_wide(__time__));
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...