能否实现通过判断函数入参的值决定代码是否参与编译?

努力向上的学渣 2018-08-21 02:41:07
先上代码例子

#define LOG_CRITICAL 0
#define LOG_ERROR 1
#define LOG_WARNING 2
#define LOG_INFO 3
#define LOG_DEBUG 4

void LogOutput(unsigned char LogLevel, const char *OutStr)
{
printf("%s",OutStr);
}

void TestFunc()
{
LogOutput(LOG_CRITICAL,"LOG_CRITICAL");
LogOutput(LOG_ERROR,"LOG_ERROR");
LogOutput(LOG_WARNING,"LOG_WARNING");
LogOutput(LOG_INFO,"LOG_INFO");
LogOutput(LOG_DEBUG,"LOG_DEBUG");
}

代码例子说明,首先定义了5个log级别,TestFunc函数中分别使用5个级别作为入参调用LogOutput函数。
最近公司在做一个项目,codesize很紧张,没法做到所有级别的log全开,只能开一部分log,工程中需要输出log的位置非常之多,不想每行代码都加宏开关。我想问,有没有什么办法能使编译器判断出log等级后不编译不符合输出的log等级对应的代码

类似于,我现在只想输出ERROR级别以上的Log,能否对编译器进行一些设置使其认为TestFunc函数中后3行代码被注释掉,这个过程不想通过手动注释和添加宏开关,单纯从设置编译选项的角度能否实现?

void TestFunc()
{
LogOutput(LOG_CRITICAL,"LOG_CRITICAL");
LogOutput(LOG_ERROR,"LOG_ERROR");
//LogOutput(LOG_WARNING,"LOG_WARNING");
//LogOutput(LOG_INFO,"LOG_INFO");
//LogOutput(LOG_DEBUG,"LOG_DEBUG");
}
...全文
184 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
如果你要不满足LOG级别的输出部分彻底不生成代码,可以把LogOutput用宏实现:
#define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0


多谢大神!简单查了一下,搞定了!多谢多谢!
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
如果你要不满足LOG级别的输出部分彻底不生成代码,可以把LogOutput用宏实现:
#define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0


您提供的方法可行!
我们的LogOutput函数入参要支持不定参数,请问#define的表达式该怎么写?
#define LogOutput(LogLevel, Msg,...) LogLevel <= LOG_LEVEL ? Output(LogLevel, Msg,...) : 0
Output函数中封装了printf,上边的宏定义编译报错,请问要怎么修改?
  • 打赏
  • 举报
回复
如果你要不满足LOG级别的输出部分彻底不生成代码,可以把LogOutput用宏实现:
#define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
#define LOG_CRITICAL 0
#define LOG_ERROR 1
#define LOG_WARNING 2
#define LOG_INFO 3
#define LOG_DEBUG 4

#define LOG_LEVEL LOG_ERROR

void LogOutput(int LogLevel, const char *OutStr)
{
if (LogLevel <= LOG_LEVEL) printf("%s\n", OutStr);
}

这种方式还是会使所有打印的地方参与编译,所以不会减小代码的size,只是不满足条件的不输出而已,不会省多少空间
我想实现的是通过某种方式,使不满足一定level的输出不参与编译,这样才能节省非常可观的size
vnvlyp 2018-08-21
  • 打赏
  • 举报
回复
一楼方法可以
不过也只是省了一个参数入栈/寄存器和函数调用的指令
你确定真的能省很多空间?
  • 打赏
  • 举报
回复
#define LOG_CRITICAL 0
#define LOG_ERROR 1
#define LOG_WARNING 2
#define LOG_INFO 3
#define LOG_DEBUG 4

#define LOG_LEVEL LOG_ERROR

void LogOutput(int LogLevel, const char *OutStr)
{
if (LogLevel <= LOG_LEVEL) printf("%s\n", OutStr);
}

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧