typedef enum {
log_level_error = 0,
log_level_warning = 1,
log_level_info = 2,
log_level_dbg = 3,
log_level_all = 4,
} my_log_level;
#define SMALL 1
#define LARGE 4
static const int current_log_level = log_level_info;
int main()
{
#if (current_log_level > SMALL)
int b;
#endif
#if (current_log_level > log_level_error)
int b;
#endif
b = 2;
return 0;
}
可能我这个问题有点蠢,但为啥我上面的程序会编译报错呢,两种形式都没有把int b;
给编译到,对于#if
的用法有点不太明白了。
1
westoy 2022-10-22 15:36:18 +08:00
这不是运行时的 if , 这是宏里的 if 啊, 编译前会替换掉的, 拿来处理变量当然会有问题了
|
2
overloadtanxxx2 2022-10-22 15:37:02 +08:00
#if 是预编译
预编译 比 编译早呀。 赋值是编译期间的操作。预编译的时候还没赋值 |
3
overloadtanxxx2 2022-10-22 15:38:16 +08:00
你试试 改成 > -1 ,看看 int b 能不能编译到。估计就能编译到了
|
4
amiwrong123 OP @westoy #1
@overloadtanxxx2 #3 谢谢,我大概理解了,所以我这个程序正确的写法应该是把: static const int current_log_level = log_level_info; 替换成 #define current_log_level 2 最好也把 枚举定义也替换成宏: typedef enum { log_level_error = 0, log_level_warning = 1, log_level_info = 2, log_level_dbg = 3, log_level_all = 4, } my_log_level; 替换为 #define log_level_error 0 #define log_level_warning 1 #define log_level_info 2 #define log_level_dbg 3 #define log_level_all 4 应该是这样做吧 |
5
overloadtanxxx2 2022-10-22 15:49:27 +08:00
@amiwrong123 感觉没什么毛病。肯定可以达到 定义不同等级打印不同等级日志的效果
|
6
overloadtanxxx2 2022-10-22 16:00:17 +08:00 1
程序符号表有一个变量 current_log_level 。在程序跑之前。根据不同编译器,值不一样。一般是 0 。预编译运行时,这个值不符合条件
|
7
amiwrong123 OP @overloadtanxxx2 #6
ok ,理解你的意思,总之,在#if 里面,不可以依赖这种全局变量的值,就算能依靠也是不可靠的 |
8
ligiggy 2022-10-22 16:19:15 +08:00
推荐看一本书,《程序员的自我修养—链接、装载与库》。
|
9
jimmy980352 2022-10-22 16:30:34 +08:00
可能编译器认为会出现变量 b 不被定义的情况,试试#if....#elif...#else...#endif 的每个区间都定义 b
|
10
amiwrong123 OP @jimmy980352 #9
嗯,你意思我理解了。留出一个#else...来保证编译到 int b; 不过我的目的是:用 打印日志等级 来控制一些打印。 正常来说,我那个程序会写成: #if (current_log_level > log_level_error) printf("error log\n"); #endif 但是我又发现这么写 好像不能起到控制编译的作用,实际效果是:我那么写 是永远不会被编译到。 |
11
iamzuoxinyu 2022-10-22 16:52:31 +08:00
@amiwrong123 为什么不干脆
#if LOG_WARN // print sth #endif #if LOG_ERROR // print err #endif 这样,编译时直接 gcc -DLOG_WARN -DLOG_ERROR 想怎么指定怎么指定…… |
12
iamzuoxinyu 2022-10-22 16:54:09 +08:00
#ifdef 更好。
|
13
lance6716 2022-10-22 22:10:17 +08:00 via Android
|