C預處理器摘要

2021-09-29 21:52:47 字數 2883 閱讀 7404

最近在學習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 還支援很多預處理...