在某些情况下,我们会有条件编译的需求,即我们希望代码能够在编译时走不同的分支,但是又不希望写两份代码,这会使得后期维护的代价增加。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会自动消失。