點擊左上方藍色“混說Linux”,選擇“設為星標”

很多優秀的代碼,都會借用預編譯指令來完善代碼,今天就來講講關于預編譯指令的內容。
#指令,無任何效果#include含一個源代碼文件#define義宏#undef消已定義的宏#if果給定條件為真,則編譯下面代碼#ifdef果宏已經定義,則編譯下面代碼#ifndef果宏沒有定義,則編譯下面代碼#elif果前面的if定條件不為真,當前條件為真,則編譯下面代碼#endif束一個if……#else件編譯塊#error止編譯并顯示錯誤信息什么是預處理指令?
#include?
#include?"test.h"
???#include?
???#define?MAX(x,y)?(((x)>(y))?(x):(y))
???#define?MIN(x,y)?(((x)<(y))?(x):(y))
???int?main(void)
???{
???#ifdef?MAX????//判斷這個宏是否被定義
???????printf("3?and?5?the?max?is:%d\n",MAX(3,5));
???#endif
???#ifdef?MIN
???????printf("3?and?5?the?min?is:%d\n",MIN(3,5));
???#endif
???????return?0;
???}
???
???/*
????*?(1)三元運算符要比if,else效率高
????*?(2)宏的使用一定要細心,需要把參數小心的用括號括起來,
????*?因為宏只是簡單的文本替換,不注意,容易引起歧義錯誤。
???*/
#include?
#define?SQR(x)?(x*x)
int?main(void)
{
???int?b=3;
#ifdef?SQR//只需要宏名就可以了,不需要參數,有參數的話會警告
???printf("a?=?%d\n",SQR(b+2));
#endif
???return?0;
}
/*
*首先說明,這個宏的定義是錯誤的。并沒有實現程序中的B+2的平方
*?預處理的時候,替換成如下的結果:b+2*b+2
*?正確的宏定義應該是:#define SQR(x)?((x)*(x))
*?所以,盡量使用小括號,將參數括起來。
*/
#include?
#define?STR(s)?#s
#define?CONS(a,b)?(int)(a##e##b)
int?main(void)
{
#ifdef?STR
???printf(STR(VCK));
#endif
#ifdef?CONS
???printf("\n%d\n",CONS(2,3));
#endif
???return?0;
}
/*?(絕大多數是使用不到這些的,使用到的話,查看手冊就可以了)
*?第一個宏,用#把參數轉化為一個字符串
*?第二個宏,用##把2個宏參數粘合在一起,及aeb,2e3也就是2000
*/
#include?
#define?WORD_LO(xxx)?((byte)((word)(xxx)?&?255))
#define?WORD_HI(xxx)?((byte)((word)(xxx)?>>?8))
int?main(void)
{
???return?0;
}
/*
*?一個字2個字節,獲得低字節(低8位),與255(0000,0000,1111,1111)按位相與
*?獲得高字節(高8位),右移8位即可。
*/
#include?
#define?ARR_SIZE(a)?(sizeof((a))/sizeof((a[0])))
int?main(void)
{
???int?array[100];
#ifdef?ARR_SIZE
???printf("array?has?%d?items.\n",ARR_SIZE(array));
#endif
???return?0;
}
/*
*總的大小除以每個類型的大小
*/
#include?
#include?
#define?DEBUG
int?main(void)
{
???int?i?=?0;
???char?c;
???while(1)
???{
???????i++;
???????c?=?getchar();
???????if('\n'?!=?c)
???????{
???????????getchar();
???????}
???????if('q'?==?c?||?'Q'?==?c)
???????{
#ifdef?DEBUG//判斷DEBUG是否被定義了
???????????printf("We?get:%c,about?to?exit.\n",c);
#endif
???????????break;
???????}
???????else
???????{
???????????printf("i?=?%d",i);
#ifdef?DEBUG
???????????printf(",we?get:%c",c);
#endif
???????????printf("\n");
???????}
???}
???printf("Hello?World!\n");
???return?0;
}
/*#endif用于終止#if預處理指令。*/
#include?
#define?DEBUG
main()
{
#ifdef?DEBUG
???printf("yes?");
#endif
#ifndef?DEBUG
???printf("no?");
#endif
}
//#ifdefined等價于#ifdef;
//#if!defined等價于#ifndef
#else指令

#elif指令

其他一些指令
#error指令將使編譯器顯示一條錯誤信息,然后停止編譯。#line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。#pragma令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。
往期推薦