如何在代码中设置一个开关,使得不执行某些代码行,比如说用来进行LOG输出的代码行?

jzp12 2008-04-03 03:42:08
#if 0
#endif
这种就算了,因为代码中LOG输出的代码行太多。
...全文
299 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hoohag 2008-04-03
  • 打赏
  • 举报
回复
直接#define ERRORLOG就可以打开开关了, 不要写就是关掉开关. 至于#define FORRELEASRLOG(LINE) 0 不会有任何问题, 只是你所有LOG的地方全变成0; 这个代码会被编译器忽略掉, 不会编到目标文件里.
hoohag 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jzp12 的回复:]
嗯,谢谢诸位,特别是hoohag ,在你的定义前面加个
#define ERRORLOG 0;
就能打开开关吧,但是如果没有打开开关的话,所在的LOG输出语句的值就是0,这会不会有什么风险,对后面的代码会有影响吗?
[/Quote]
#define ERRORLOG 0;不会有任何风险,放心用好了.
jzp12 2008-04-03
  • 打赏
  • 举报
回复
嗯,谢谢诸位,特别是hoohag ,在你的定义前面加个
#define ERRORLOG 0;
就能打开开关吧,但是如果没有打开开关的话,所在的LOG输出语句的值就是0,这会不会有什么风险,对后面的代码会有影响吗?
zsyddl2 2008-04-03
  • 打赏
  • 举报
回复
和上面 有 几楼的 做法一样
zsyddl2 2008-04-03
  • 打赏
  • 举报
回复
#ifdef _DEBUG
#define TRACE printf
#else
#define TRACE
#endif
这样 当不定义_DEGBUG的时候 就 没有任何多余代码
使用
TRACE("....");和printf一样使用
风云剑客 2008-04-03
  • 打赏
  • 举报
回复
可以定义一个变量开关,然后定义printf()的操作宏,这样可以实现楼主的功能,最好自己定义一个公共的头文件来实现。
#include <stdio.h>
const bool OUT_LOG = 0 ;
#define printf(a) if (OUT_LOG) printf(a) else //不进行操作或换成另外的操作
int main()
{
printf("text");
return 0;
}
hoohag 2008-04-03
  • 打赏
  • 举报
回复
在工程属性里面加上 /D "_ERRORLOG"就是打开, 不加就是关闭

至于开销问题, 虽说不大, 但假如一个程序里面有1万次调用, 调用函数LOG(), 带来的性能损失还是有的, 站在工程的角度来看, 能不编译进去的代码, 尽量不要编到目标文件中. 同时在外面人看来, 既看不到LOG()源代码的人, 你的函数里面加了宏, 可使用的人并不知道里面的宏是怎样, 这样容易理解上的偏差, 我们尽量应该让自己的代码友好一点, 用FORERRORLOG(LOG()); 可以清楚的告诉任何人, LOG()函数是否起作用是和某个宏相关的,这样如果需要关注得的人会去注意这个宏, 这个应该比把宏加在函数内部要友好很多.
jzp12 2008-04-03
  • 打赏
  • 举报
回复
那个开销太大,
TO:hoohag
能否再明示一下?
taodm 2008-04-03
  • 打赏
  • 举报
回复
既然楼主自己的方法已经可以用了,还有啥好问的呢。
jzp12 2008-04-03
  • 打赏
  • 举报
回复
那如何打开_ERRORLOG这个LOG的开关?如何关闭这个开关?
hoohag 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jzp12 的回复:]
就是只要一个开关使得执行或者不执行代码行中
printf("");
这样的输出语句。
[/Quote]

但是这样还是有一次函数调用的开销呀....
jzp12 2008-04-03
  • 打赏
  • 举报
回复
就是只要一个开关使得执行或者不执行代码行中
printf("");
这样的输出语句。
hoohag 2008-04-03
  • 打赏
  • 举报
回复
我的做法是先有下面的宏定义
#ifdef _ERRORLOG
#define FORERRORLOG(LINE) LINE
#else
#define FORERRORLOG(LINE) 0
#endif

然后把使用LOG()的地方全部改成
FORERRORLOG(LOG());

然后_ERRORLOG可以作为LOG的开关
laolaoliu2002 2008-04-03
  • 打赏
  • 举报
回复
#define OUTPUT_LOG
Supper_Jerry 2008-04-03
  • 打赏
  • 举报
回复
整体用宏。
rageliu 2008-04-03
  • 打赏
  • 举报
回复
楼上这样,只需要NEED_LOG一个就控制全了
HelloDan 2008-04-03
  • 打赏
  • 举报
回复
判断句
qmm161 2008-04-03
  • 打赏
  • 举报
回复
汗一个

#ifdef NEED_LOG
#define LOG()\
{printf(...)...}
#else
#define LOG()
#endif

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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