<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
下面看一段簡單的條件編譯的程式碼:
#include <stdio.h> #define C 1 int main() { const char* s; #if( C == 1 ) s = "This is first printf...n"; #else s = "This is second printf...n"; #endif printf("%s", s); return 0; }
下面為輸出結果:
可以輸入gcc -E Test.c -o file.i 命令,看看預編譯階段發生了什麼,下面是部分輸出結果:
# 2 "Test.c" 2 int main() { const char* s; s = "This is first printf...n"; printf("%s", s); return 0; }
可以看到宏定義和條件編譯都沒有了,由相應內容取而代之。
預編譯器根據條件編譯指令有選擇的刪除程式碼
編譯器不知道程式碼分支的存在
if...else... 語句在執行期進行分支判斷
條件編譯指令在預編譯期進行分支判斷
可以通過命令列定義宏
下面看一個通過命令列定義宏的程式碼:
#include <stdio.h> int main() { const char* s; #ifdef C s = "This is first printf...n"; #else s = "This is second printf...n"; #endif printf("%s", s); return 0; }
終端輸入gcc -DC Test.c,輸出結果如下:
這就出現一個問題,間接包含同一個標頭檔案是否會產生編譯錯誤?
下面就來通過一段程式碼深入探究:
global.h:
// global.h int global = 10;
test.h:
// test.h #include "global.h" const char* NAME = "test.h"; char* hello_world() { return "hello world!n"; }
test.c:
#include <stdio.h> #include "test.h" #include "global.h" int main() { const char* s = hello_world(); int g = global; printf("%sn", NAME); printf("%dn", g); return 0; }
編譯後編譯器報錯,global 重定義:
為什麼 global 會重定義呢?下面開始單步編譯,輸入gcc -E test.c -o test.i,輸出部分結果如下:
# 2 "test.c" 2 # 1 "test.h" 1 # 1 "global.h" 1 int global = 10; # 4 "test.h" 2 const char* NAME = "test.h"; char* hello_world() { return "hello world!n"; } # 3 "test.c" 2 # 1 "global.h" 1 int global = 10; # 4 "test.c" 2 int main() { const char* s = hello_world(); int g = global; printf("%sn", NAME); printf("%dn", g); return 0; }
這樣就很明顯了,程式先將 test.h 裡面的東西複製進 test.c,由於 test.h 裡面有一個 include "global.h",就把int global = 10; 複製過來,然後複製
const char* NAME = "test.h";
char* hello_world()
{undefined
return "hello world!n";
}
在然後由於test.c 裡面又定義一個#include "global.h",又把int global = 10; 複製過來,造成了重複定義。
條件編譯可以解決標頭檔案重複包含的編譯錯誤
#ifndef _HEADER_FILE_H_ #define _HEADER_FILE_H_ //source code #endif
如果沒有定義 header_file.h,則定義,且執行裡面的程式碼;否則,如果定義了,裡面的程式碼就不會執行。
所以上述程式碼中可以這麼改:
global.h:
// global.h #ifndef _GLOBAL_H_ #define _GLOBAL_H_ int global = 10; #endif
test.h:
// test.h #ifndef _TEST_H_ #define _TEST_H_ #include "global.h" const char* NAME = "test.h"; char* hello_world() { return "hello world!n"; } #endif
這樣編譯就能通過了
條件編譯使得我們可以按不同的條件編譯不同的程式碼段,因而可以產生不同的目的碼
#if...#else...#endif 被預編譯器處理,而 if...else... 語句被編譯器處理,必然被編譯進目的碼
實際工程中條件編譯主要用於以下兩種情況:
下面看一段產品線區分及偵錯程式碼:
product.h:
#define DEBUG 1 #define HIGH 1
test.c:
#include <stdio.h> #include "product.h" #if DEBUG #define LOG(s) printf("[%s:%d] %sn", __FILE__, __LINE__, s) #else #define LOG(s) NULL #endif #if HIGH void f() { printf("This is the high level product!n"); } #else void f() { } #endif int main() { LOG("Enter main() ..."); f(); printf("1. Query Information.n"); printf("2. Record Information.n"); printf("3. Delete Information.n"); #if HIGH printf("4. High Level Query.n"); printf("5. Mannul Service.n"); printf("6. Exit.n"); #else printf("4. Exit.n"); #endif LOG("Exit main() ..."); return 0; }
宏 DEBUG 是指產品是偵錯版還是釋出版,偵錯版為 1,釋出版為 0, 宏 HIGH指的是產品是高階產品還是低端產品,高階產品為 1,低端產品為 0
如果我們想測試偵錯版的高階產品,令 DEBUG 為 1,HIGH為 0 即可:
同理,我們想測試釋出版的低端產品,令 DEBUG 為 0,HIGH為 0 即可:
到此這篇關於C語言 深入講解條件編譯的用處的文章就介紹到這了,更多相關C語言 條件編譯內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45