Posted on 2018-11-28 15:55
Prayer 阅读(657)
评论(0) 编辑 收藏 引用 所属分类:
C/C++ 、
makefile
https://blog.csdn.net/gdutliuyun827/article/details/17297513
在源代码里面如果这样是定义的:
#ifdef MACRONAME
//可选代码
#endif
那在makefile里面
gcc -D MACRONAME=MACRODEF
或者
gcc -D MACRONAME
这样就定义了预处理宏,编译的时候可选代码就会被编译进去了。
对于GCC编译器,有如下选项:
-D macro=string,等价于在头文件中定义:#define macro string。例如:-D TRUE=true,等价于:#define TRUE true
-D macro,等价于在头文件中定义:#define macro 1,实际上也达到了定义:#define macro的目的。例如:-D LINUX,等价于:#define LINUX 1(与#define LINUX作用类似)。
--define-macro macro=string与-D macro=string作用相同。
如:
TEST.C 文件 #include <stdio.h> #include <stdlib.h> main() { #ifdef p1 printf("Hello p1"); #else printf("Hello p2"); #endif }
1.
编译: gcc -o test test.c
运行: ./test
输出: Hello p2
2.
编译: gcc -o test test.c -D p1
运行: ./test
输出: Hello p1
还有另外一种使用方式:
Makefile写法:
$(SERVER_NAME):$(SERVER_OBJ) $(COM_OBJS) $(CC) -Wall -pthread -D KRC_SERVER_NAME=$(SERVER_NAME)_FLAG
C代码中用法:
#if KRC_SERVER_NAME == krc_search_FLAG #elif KRC_SERVER_NAME == krc_feedback_FLAG #else #endif 注意:其中的两个参数为宏定义,不能使用常量定义,因为需要在预编译阶段就要确定其值! #define krc_search_FLAG 1 #define krc_feedback_FLAG 2
这种用法也能实现条件编译的作用,而且更好!