user-0 提问: c语言是否可以实现根据#define定义的不同level使高于这个level的代码参与编译

回复:
user: user-1
content: log分等级是鸡肋。个人意见。

user: user-2
content: 代碼改成這樣  PRINT(debug_level Level, const char *outString, ...) { #if (IsOutput(Level))     {         printf(outString,...);     } #endif }

user: user-0
content: 引用 4 楼 boxmanstan 的回复:[quote=引用 2 楼 杀意已决的回复:]你的思路是对的，区分了不同等级的log，只需要在你的PRINT里处理一下就可以了 参照一楼，用几个宏就行了[/quote] 你好，参照我的回复，能详细解释一下吗？谢谢

user: user-0
content: 引用 1 楼 zhao3132453 的回复:调试输出放到条件中，就只有debug下才会输出 #ifdef  _DEBUG printf(...); printf(...); #endif 没有太明白你的做法，也可能是我没有说清楚 目前所有的调试输出都是基于PRINT这个函数，至于debug level也是在这个函数内部进行判断的，所以如果编译所有的debug level都会参与编译，无法做到部分编译，如下  PRINT(debug_level Level, const char *outString, ...) {     if(IsOutput(Level))     {         printf(outString,...);     } }

user: user-3
content: 引用 2 楼 杀意已决的回复:你的思路是对的，区分了不同等级的log，只需要在你的PRINT里处理一下就可以了 参照一楼，用几个宏就行了

user: user-2
content: 可以的，在PRINT中這麽用：  #if //符合某個條件時執行 #endif  編譯時指定debug級別，就可以控制編譯的内容 但是，你依然無法全部打開。 也可以考慮在編譯時指定優化級別使目標代碼更小

user: user-3
content: 你的思路是对的，区分了不同等级的log，只需要在你的PRINT里处理一下就可以了

user: user-4
content: 调试输出放到条件中，就只有debug下才会输出 #ifdef  _DEBUG printf(...); printf(...); #endif

user: user-1
content: 引用 13 楼 huchuanbin0110 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 为什么不使用代码生成技术呢？ 能否详细说一下如何实现，一头雾水。。。[/quote] 仅供参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //

user: user-0
content: 引用 16 楼 DelphiGuy 的回复:见你另一贴... 完美的解决了我的问题，已在另一帖中加分了，多谢

user: user-5
content: 见你另一贴...

user: user-2
content: 按模塊打開debug信息也是可行的，改一下函數的架構吧，你要使PRINT函數在模塊中就決定調用與否：   ... #if _DEBUG_THIS_MOD PRINT(...); #endif ...

user: user-0
content: 引用 12 楼 hzy_76 的回复:某些條件下代碼無效，正是你要的效果——有條件的編譯。這樣才能但這麽改的前提是IsOoutput是一個宏而不是函數。 但是你要的其實是完整的debug信息？那你開頭的思路就不通了，還是想想辦法優化代碼吧。 是的，我是想要完整的debug信息，但因为code size的问题，不得不将debug信息分级，在调试到哪个模块就开启哪个模块的debug信息，从而达到在有限的资源下实现debug的目标。

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:为什么不使用代码生成技术呢？ 能否详细说一下如何实现，一头雾水。。。

user: user-2
content: 某些條件下代碼無效，正是你要的效果——有條件的編譯。這樣才能但這麽改的前提是IsOoutput是一個宏而不是函數。 但是你要的其實是完整的debug信息？那你開頭的思路就不通了，還是想想辦法優化代碼吧。

user: user-1
content: 为什么不使用代码生成技术呢？

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:log分等级是鸡肋。个人意见。 求大神指点，如何实现能满足我的需求，即代码size可以减小，debug信息还可以正常输出？

user: user-0
content: 引用 7 楼 hzy_76 的回复:代碼改成這樣  PRINT(debug_level Level, const char *outString, ...) { #if (IsOutput(Level))     {         printf(outString,...);     } #endif }  这样定义之后，#if 与 #endif之间的代码都无效了，即没有被编译，所以永远也无法执行#if之内的代码了。 即使将level定义一个固定的值，#if 与 #endif之间的代码同样无效