淺談預處理標識符

簡單認識c標準指定的一些預定義宏:

__DATA__   文件被編譯的日期(例爲:Oct 17 2016 形式的字符串文字)

__FILE__     代表進行編譯的源文件 

__LINE__     代表文件中__LINE__ 所在位置的當前行號

__TIME__    源文件被編譯的時間(例爲:14:50:46 )

__STDC__  如果編譯器遵循ANSI C,其值爲1,否則爲0;


這些是預定義宏,直接可以拿來使用;對於以上幾個預定義主要是用來輸出當前被編譯的源文件的信息;當多個文件進行編譯時,可以用來輸出簡單的日誌文件,在代碼中出錯的那一行打印這些預定義宏可以輕鬆的找出出錯文件的信息;


宏中的#功能:在宏函數中使用,是將其後緊跟的宏參數進行字符串化的操作;在解釋#功能之前先說一下printf函數中

鄰近字符串連接特性,即printf("hello "" csdn");這個打印出來是一個字符串,和printf("hello  csdn");的效果是一模一樣的;此處要注意的是printf("");引號中的內容被看做普通文本,在宏函數中若宏參數在引號內包含,是不會被替換;例如:

#define PRINT(FORMAT )\
	printf("this value of FORMAT is %d\n",FORMAT)

int main()
{
	PRINT(6)	;
	

	//system("pause");
	return 0;
}

輸出爲:this value of FORMAT is 5;

而對於:

#define PRINT(FORMAT )\
printf("this value of "# FORMAT"is %d\n",FORMAT)
int main()
{
	PRINT(5);
	system("pause");
	return 0;
}


在預處理時需要進行宏替換,識別到PRINT是一個宏,然後對宏參數進行替換,先將#FORMAT替換爲#5,#進行字符化操作後:"5",後面的FORMAT也被替換爲5.替換後爲:printf(" this value of " "5" " is \%dn",5 );輸出爲this value of 5 is 5;

宏中##的功能:它把位於它兩邊的符號連接成一個符號

看例子:

#define INOS(STR1,STR2) STR1##STR2
#define STR1 printf("str1");
#define STR2 printf("str2");
#define STR1STR2 printf("str1str2");
int main()
{
	
	INOS(STR1,STR2);

	system("pause");
	return 0;
}


最終的輸出結果爲:str1str2;

INOS的作用就是將##左邊的STR1和右邊的STR2粘合爲STR1STR2;最終是STR1STR2進行宏替換;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章