1#和##的作用和用法
C/C++ 的宏中,#的功能是將其后面的宏參數進行字符串化操作,簡單說就是在對它所引用的宏變量通過替換后在其左右各加上一個雙引號。##連接符號由兩個井號組成,其功能是在帶參數的宏定義中將兩個子串聯接起來,從而形成一個新的子串。但它不可以是第一個或者最后一個子串。
#include
凡是宏定義里有用#或##的地方宏參數是不會再展開,例如_STRI(INT_MAX)中的INT_MAX就不會被展開為2147483647。如果想要使其中的宏參數展開,則需要多加一層中間轉換宏:
#define STRI(s) _STRI(s)cout << STRI(INT_MAX) << endl; // prints : 2147483647
加這層宏的用意是把所有宏的參數在這層里全部展開,那么在轉換宏里的宏就能得到對應的宏參數。
接下來,我們來了解通過預處理指令創建條件編譯參數控制代碼編譯的一些用法。
2#include的用法
包含頭文件的操作,通常有兩種格式:
#include
<>和""表示編譯器在搜索頭文件時的順序不同:
<>表示從系統目錄下開始搜索,然后再搜索PATH環境變量所列出的目錄,不搜索當前目錄
""是表示從當前目錄開始搜索,然后是系統目錄和PATH環境變量所列出的目錄。
所以,系統頭文件一般用<>,用戶自己定義的則可以使用"",加快搜索速度。除此外,寫代碼多了就會發現,有些頭文件之間的相互包含是有隱藏依賴關系的,一定要加以注意。Google C++ Style Guide中也強調使用標準的頭文件包含順序可增強可讀性, 避免隱藏依賴:
1 相關文件(優先位置,如dir2/foo2.h)2 C系統文件3 C++ 系統文件4 其他庫的.h文件5 本項目內.h文件
3#if,#elif,#else,#endif用法
// structure 1#if constant_expression#else#endif// structure 2#if constant_expression#elif constant_expression#endif
這里的結構跟常見的if...else和if...else if...else語句類似,當#if后的條件為非零(true)時,編譯#if和#else或#elif之間的代碼,否則編譯#else和#endif之間的代碼(或者判斷#elif后的條件是否非零(true),決定是否編譯#elif和#endif之間的代碼)。
#if 1 cout << "Hello world!" << endl;#else ? ?cout << "Nice to meet you!" << endl;#endif// prints : Hello world!
#if 1 cout << "Hello world!" << endl; #elif 1 ? ?cout << "Nice to meet you!" << endl; #endif// prints: Hello world!// ? ? ?Nice to meet you!
4#define,#undef,#ifdef,#ifndef用法
#define是大家都常見的宏定義方法,用法結構為:
// #define identifier replacement-code#define PI 3.1415926#define ADD(x,y) (x + y)
#undef顧名思義,就是從該處取消前面已經定義的宏,如果標識符當前沒有被定義稱為一個宏名稱,就會忽略該指令:
// #undef identifier#undef PI
#ifdef和#ifndef含義相反,前者含義為如果定義了該宏,則編譯相應代碼;后者則為如果沒有定義該宏,則編譯相應代碼。通用結構為:
/* * #ifdef identifier * #else or #elif * #endif **/ #define DEBUG#ifdef DEBUG cout << "This is a debug message." << endl;#endif// prints : This is a debug message./* * #ifndef identifier * #else or #elif * #endif **/ #ifndef DEBUG ?cout << "This is a debug message." << endl;#endif// prints nothing
在編程時,為了避免頭文件重定義,經常使用的就是#define配合條件編譯解決:
#ifndef MY_HEADER_FILE_H#define MY_HEADER_FILE_H// ...class MyHeaderFile { // ....};#endif // MY_HEADER_FILE_H
除此以外,還有#pragma once的用法,只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次。(在所有的預處理指令中,#pragma指令可能是最復雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作,本文不多講述。)
5#line用法
#line命令是用于更改__LINE__和__FILE__變量的值。__FILE__和__LINE__描述被讀取的當前文件和所在行數。
// #line line-number filenameint main() {#line 10 "main.cpp" cout << __FILE__ << " " << __LINE__ << endl; }// prints : main.cpp 10
6#error用法
#error會直接導致程序停止編譯并輸出指定的錯誤信息:
// #error message#ifndef VERSION#error Version number not specified.#endif// The compiler will halt compiling and return with the specified error message: // fatal error C1189: #error : Version number not specifi
-
C語言
+關注
關注
180文章
7614瀏覽量
137254
原文標題:C++ "#"的作用和用法
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論