最近在學習c,記錄一下c預處理器。c預處理器不是編譯器的組成部分,但是它是編譯過程中乙個單獨的步驟。簡言之,c預處理器只不過是乙個文字替換工具而已,他們會指示編譯器在實際編譯過程中所需的預處理。我們將c預處理器(c preprocessor)簡寫為cpp。
#define
定義巨集定義
#define pi 3.1415926
#include
包含乙個源**的檔案,這個我們用得比較多,基本上開始學習c預言的時候就開始了。
#include
#undef
取消巨集定義
#undef pi
舉個例子:
int
main()
#ifdef ***
***x
#endif
#ifdef 和 #endif 配套使用,如果巨集已經定義,則返回真。
#define pi 3.1415926
#ifdef pi
#define new_data 2
#endif
#ifndef ***
***#endif
如果巨集沒有定義,則返回為真
#ifndef message
#define message "hello world"
#endif
printf
("the message is %s"
, message)
;
#if xx
xx#elif ***
xx#endif
如果給定的條件為真,則編譯一下的**。
#if defined(os_unix)
getunixsysteminfo()
;#elif defined(os_windows)
getwindowssysteminfo()
;#endif
#error "***x"
當遇到標準錯誤時,輸出錯誤訊息。
#define os_unix 1
#ifdef os_unix
#error "os_unix has been defined"
#endif
以上演示#error 異常,用於編譯器觸發的異常。主要用途是在龐大,複雜的系統中,預處理是否按照自己的思路去走,自己定義的巨集是否也被其他檔案定義,相當於編譯期間的一種錯誤查詢。
用法比較多,這裡舉幾個簡單的例子:
#pragma message 用於自定義編譯資訊
#define android_version_8
#if defined android_version_8
#pragma message_new "this version is android 8"
#define android_version 8.0
#elif defined android_version_9
#pragma message_new "this version is android 9"
#define android_version 9.0
#else
#error no version has complied
#endif
在編譯期間將會有message_new的輸出,但是在執行時看不見,這就是預處理的強大之處。
#pragma once 用於標頭檔案只被編譯一次
#include
#include
"test.h"
#include
"test.h"
引入兩次test.h, test.h下檔案內容為:
#pragma once
int pragma_value =
10;
但還是能正常輸出,如果去掉
// #pragma once
程式會報多次定義錯誤。
#pragma pack 用於指定記憶體對齊(一般用於結構體)
一般在結構體中,記憶體對齊需要滿足的條件是:
第乙個成員起始於0偏移處;舉個例子:每個成員按其型別大小和pack引數中較小的乙個進行對齊(偏移位址必須能被對齊引數整除,結構體對齊引數取其內部最大資料成員作為其大小);
結構體總長度必須為所有對齊引數的整數倍。
#include
#pragma pack(2)
struct p1
;//8
#pragma pack()
#pragma pack(4)
struct p2
;//12
#pragma
#pragma pack(8)
struct p3
;//16
struct p4
;//32
#pragma
intmain()
參考:
1.
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...