C語言實現條件編譯

在某些情況下,我們會有條件編譯的需求,即我們希望代碼能夠在編譯時走不同的分支,但是又不希望寫兩份代碼,這會使得後期維護的代價增加。C不太熟,簡單說一下我理解的條件編譯。

修改Makefile定義宏進行條件編譯

寫一個簡單的C程序hello.c:

#include<stdio.h>
void main()
{
#ifdef DEBUG
printf("#ifdef DEBUG is running!\n");
#else
printf("#else is running!\n");
#endif
return ;
}

Makefile文件如下:

ifeq ($(debug),yes)
CFLAGS += -DDEBUG
CFLAGS += -std=gnu99
endif
hello:hello.c
        gcc $(CFLAGS) $< -o $@

要注意一下,Makefile的用法有些奇怪,gcc那一行命令前的空白是tab而不是四個空格,如果是四個空格的話,後續會報錯

Makefile中的CFLAGS += -DDEBUG可以寫成CFLAGS := -DDEBUG,Makefile也可以這麼寫:

ifeq ($(debug),yes)
ADD_CFLAGS := -DDEBUG
ADD_CFLAGS += -std=gnu99
endif
hello:hello.c
        gcc $(ADD_CFLAGS) $< -o $@

make編譯時不帶宏與帶宏的結果對比如下圖:

直接在源碼中定義宏進行條件編譯

創建hello2.c,如下:

#include<stdio.h>
#define C   1
void main()
{
#if (C==1)
printf("#ifdef DEBUG is running!\n");
#else
printf("#else is running!\n");
#endif
return ;
}

創建hello3.c,如下:

#include<stdio.h>
#define C   2
void main()
{
#if (C==1)
printf("#ifdef DEBUG is running!\n");
#else
printf("#else is running!\n");
#endif
return ;
}

分別編譯運行運行hello2.c與hello3.c,查看對比結果。

以上就是一些簡單的條件編譯的方法,當然在源碼修改也可以用到#ifdef,#ifndef,#else,#elif這些指令,這裏就不一一介紹了。文中的例子雖然實現簡單,在工程中也是有效的,如果帶編譯選項編譯後出現了很多warning,可以先用-w選項把warning屏蔽,解決err後很多warning會自動消失

參考:https://www.cnblogs.com/sj-lv/p/3456713.html

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