C的预处理选项在代码里很常见. 对控制生成的目标代码有控制作用. 如:
int main()
{
do_something();
#ifdef __DEBUG__
printf("__DEBUG__ DEFINED\n");
printf("%d\n",A);
#endif
return 0;
}
可以通过__DEBUG__去控制是否加入测试代码. 现在就有个问题: 怎么在编译时改变这一个值? 如:
#if __DEBUG__ == 1
难道要去修改源文件? 显然这是不对的做法. gcc是有参数去处理这些东西:
-D name=definition
-U name
下面做做测试:
jessinio@jessinio-laptop:/tmp$ cat test.c
void *main(int argc, char *argv[]){
#ifdef __DEBUG__
printf("%s\n", "debug info");
#endif
}
jessinio@jessinio-laptop:/tmp$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
void *main(int argc, char *argv[]){
}
可以看出, 因为没有那个__DEBUG__ 宏, 所以printf没有被加入代码中. 如下就可以:
jessinio@jessinio-laptop:/tmp$ gcc -E -D__DEBUG__ test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
void *main(int argc, char *argv[]){
printf("%s\n", "debug info");
}
不过这有个问题, 就是每次都是在gcc命令中这样的参数不是很难看? 环境是环境变量? 找个Makefile看一下就知道了
看到这句:
# Compiler options
OPT= -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
很明显, 是使用变量的方式. gcc怎么知道呢?
又看到这句话:
$(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
很明显, 就是在命令行中指定~~~~ (-_-)!
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.