Cyuyan預處理命令總結

2021-10-08 06:24:35 字數 3277 閱讀 3725

#,##

#和##操作符是和#define巨集使用的. 使用# 使在#後的首個引數返回為乙個帶引號的字串. 例如, 命令

#define to_string( s ) # s
將會使編譯器把以下命令

cout << to_string( hello world! ) << endl;
理解為

cout << "hello world!" << endl;
使用##鏈結##前後的內容. 例如, 命令

#define concatenate( x, y ) x ## y

...int xy = 10;

...

將會使編譯器把

cout << concatenate( x, y ) << endl;
解釋為

cout << xy << endl;
理所當然,將會在標準輸出處顯示』10』.

#define

語法:#define macro-name replacement-string

#define命令用於把指定的字串替換檔案中的巨集名稱 . 也就是說, #define使編譯器把檔案中每乙個macro-name替換為replacement-string. 替換的字串結束於行末. 這裡是乙個經典的#define應用 (至少是在c中):

#define true 1

#define false 0

...int done = 0;

while( done != true )

#define命令的另外乙個功能就是替換引數,使它 假冒建立函式一樣使用. 如下的**:

#define absolute_value( x ) ( ((x) < 0) ? -(x) : (x) )

...int x = -1;

while( absolute_value( x ) )

當使用複雜的巨集時,最好使用額外的圓括號. 注意在以上的例子中, 變數"x"總是出現在它自己的括號中. 這樣, 它就可以在和0比較,或變成負值(乘以-1)前計算值. 同樣的, 整個巨集也被括號圍繞, 以防止和其它**混淆. 如果你不注意的話, 你可能會被編譯器曲解你的**.

#error

語法:#error message

#error命令可以簡單的使編譯器在發生錯誤時停止. 當遇到乙個#error時,編譯器會自動輸出行號而無論message的內容. 本命令大多是用於除錯.

#if, #ifdef, #ifndef, #else, #elif, #endif

這些命令讓編譯器進行簡單的邏輯控制. 當乙個檔案被編譯時, 你可以使用這些命令使某些行保留或者是去處.

#if expression
如果表示式(expression)的值是"真"(true),那麼緊隨該命令的**將會被編譯.

#ifdef macro
如果"macro"已經在乙個#define宣告中定義了, 那麼緊隨該命令的**將會被編譯.

#ifndef macro
如果"macro"未在乙個#define宣告中定義, 那麼緊隨命令的**將會被編譯.

一些小邊注: 命令#elif是"elseif"的一種縮寫,並且他可以想你所意願的一樣工作. 你也可以在乙個#if後插入乙個"defined"或者"!defined"以獲得更多的功能.

這裡是一部分例子:

#ifdef debug

cout << "this is the test version, i=" << i << endl;

#else

cout << "this is the production version!" << endl;

#endif

你應該注意到第二個例子比在你的**中插入多個"cout"進行除錯的方法更簡單.

#include

語法:#include

#include 「filename」

本命令包含乙個檔案並在當前位置插入. 兩種語法的主要不同之處是在於,如果filename括在尖括號中,那麼編譯器不知道如何搜尋它. 如果它括在引號中, 那麼編譯器可以簡單的搜尋到檔案. 兩種搜尋的方式是由編譯器決定的,一般尖括號意味著在標準庫目錄中搜尋, 引號就表示在當前目錄中搜尋. the spiffy new 整潔的新c++ #include目錄不需要直接對映到filenames, 至少對於標準庫是這樣. 這就是你有時能夠成功編譯以下命令的原因

#include
#line

語法:#line line_number 「filename」

#line命令是用於更改__line__ 和 __file__變數的值. 檔名是可選的.linefile變數描述被讀取的當前檔案和行. 命令

#line 10 "main.cpp"
更改行號為10,當前檔案改為"main.cpp".

#pragma

#pragma命令可以讓程式設計者讓編譯器執行某些事. 因為#pragma命令的執行很特殊,不同的編譯器使用有所不同. 乙個選項可以跟蹤程式的執行.

#undef

#undef命令取消乙個先前已定義的巨集變數, 譬如乙個用#define定義的變數.

預定義變數

語法:line

file

date

time

_cplusplus

stdc

下列引數在不同的編譯器可能會有所不同, 但是一般是可用的:

linefile變數表示正在處理的當前行和當前檔案.

date變數表示當前日期,格式為month/day/year(月/日/年).

time變數描述當前的時間,格式為hour:minute:second(時:分:秒).

_cplusplus 變數只在編譯乙個c++程式時定義.

stdc變數在編譯乙個c程式時定義,編譯c++時也有可能定義.

常見的預處理命令總結

常見的預處理命令總結 空指令 將位於其後面的任何字元用引號引起來 define show x cout 然後呼叫show x show hello world 相當於 cout include 在該命令位置處包含乙個原 檔案 define 定義乙個巨集 define x 5 int a x 相當於 ...

C語言預處理命令總結

包含標準庫的標頭檔案建議用尖括號,包含自定義的標頭檔案建議用雙引號。如 include include myheader.h 巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的替換。字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查,如有錯...

C語言總結 預處理命令

c語言總結 預處理命令 2019 3 30 預處理命令可以提高程式設計效率,但其不是c語句,編譯系統不能直接對它們進行編譯,而是在編譯前會轉換為c源程式,然後編譯時去掉了預處理命令。1.巨集定義 巨集定義在使用時,系統只是用巨集名之後的部分替換語句中包含的巨集名,如果是含參巨集定義,將實際的引數替換...