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

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