預處理階段任務
預處理指令
條件編譯宏
條件編譯宏的作用在于根據編譯時的條件進行代碼的選擇性編譯,從而實現不同環境、不同配置或不同功能的編譯版本。
這可以用于實現調試模式和發布模式的切換,平臺適配,以及選擇性地編譯不同的功能模塊等。通過合理使用條件編譯宏,可以提高代碼的靈活性、可維護性和可移植性。
1
//#ifdef 和 #ifndef:這指令用于判斷某個宏是否已經被定義。
#ifdef DEBUG// 定義了 DEBUG 宏對應的代碼塊
#else// 沒有定義 DEBUG 宏對應的代碼塊
#endif
//判斷出當前是不是WIN32平臺。
#include <stdio.h>int main()
{
#ifdef _WIN32printf("這是win32平臺\n");
#elseprintf("這不是win32平臺\n");
#endif // _WIN32
}
2
//#if:該指令用于在編譯時對表達式進行求值,根據結果判斷是否編譯代碼塊中的內容。
//此處的表達式要求在預處理階段值是可以被求出的,常見的包括宏定義的值、常量、運算表達式等。#if (VALUE == 1) // 小括號可以省略不寫// 在VALUE為1時執行的代碼
#elif (VALUE == 2)// 在VALUE為2時執行的代碼
#else// 在其他情況下執行的代碼
#endif
//根據宏 VALUE 的值,編譯器會根據條件選擇性地編譯 #if、#elif 或 #else 后面的代碼塊。
#define VALUE 5
int main()
{int number = 5;
#if VALUE > 5number += 10;
#elif VALUE < 5number *= 10;
#elsenumber++;
#endif printf("number = %d\n", number);
}
pragma
#pragma 是C和C++語言中的一個預處理指令,用于向編譯器發出特定的指示或命令。
//用于防止頭文件的重復包含
#pragma once
// 頭文件的內容
//#pragma pack:用于設置結構體的內存對齊方式。#pragma pack 可以設置結構體成員的對齊方式,以便在內存中緊湊地存儲數據。// 將當前的對齊方式壓棧,并設置為 n 字節對齊
#pragma pack(push, n)
// 結構體定義和成員
#pragma pack(pop) // 恢復之前的對齊方式
//#pragma warning:用于控制編譯器警告的輸出級別。#pragma warning 可以修改編譯器輸出的警告信息級別。// 禁用指定警告
#pragma warning(disable: warning_number)
// 恢復指定警告到默認級別
#pragma warning(default: warning_number)
實際上各個編譯器還支持各種不同的 pragma 指令,具體的使用方法和支持的指令可以參考編譯器的文檔或手冊。需要注意的是,pragma 指令的具體行為和效果在不同的編譯器之間可能有所不同,并且使用 pragma 指令可能導致代碼的可移植性降低。因此,在使用 pragma 指令時應當謹慎,并考慮平臺和編譯器的兼容性。
井號運算符 ‘#’
在C和C++中,# 運算符(井號運算符)用于將宏參數轉換為字符串常量。
#include <stdio.h>
#define STRINGIZE(x) printf(""#x" value is %d\n", (x))int main()
{int number = 666;STRINGIZE(number);return 0;
}輸出:
number value is 666
拼接運算符 ‘##’
是宏預處理運算符,稱為連接運算符或拼接運算符。它只能在宏定義中使用,用于將兩個符號(可以是標識符、關鍵字或其他字符)連接在一起形成一個新的標識符。
#include <stdio.h>
#define NAME(n) yyds##n
#define STRNAME(n) "yyds_"#n""
#define STRINGIZE(x) printf("yyds"#x" value is %d\n", yyds##x)int main()
{int NAME(1) = 100;int NAME(2) = 200;int NAME(3) = 300;STRINGIZE(1);STRINGIZE(2);STRINGIZE(3);printf("%s\n", STRNAME(Leifeng));printf("%s\n", STRNAME(9527));return 0;
}輸出:
yyds1 value is 100
yyds2 value is 200
yyds3 value is 300
yyds_Leifeng
yyds_9527
詳細教程可轉
愛編程的大丙