C 標準庫 預處理器

2021-07-03 14:32:50 字數 1738 閱讀 6149



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 還支援很多預處理...