宏定义:展开之后为注释 即//

pengcar 2006-03-22 03:22:55
怎么把一个宏定义成注释?
比如语句MACRO_TEST(123)展开之后变为//(123)
...全文
630 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengcar 2006-03-23
  • 打赏
  • 举报
回复
多谢各位的热心参与.问题很好的解决了.
  • 打赏
  • 举报
回复
楼上的在搞什么, 这是 C , 搞什么模板, 即使在 ADS 上可以用C甚至可以用模板, 你也木知 armcpp 对模板的支持有多差, 何况你那样写跟LZ的也没有任何区别.
KDE 2006-03-23
  • 打赏
  • 举报
回复
template<bool debug> class Trace
{
public:
Trace(const char *format,...){
// do your work
}
};

template<> class Trace<false>
{
public:
Trace(){}
};


#ifdef DEBUG
#define M_TRACE(format, ...) Trace<true> __tmp(format, __VA_ARGS__)
#else
#define M_TRACE(format, ...) Trace<false> __tmp;
#endif
  • 打赏
  • 举报
回复
我都是酱紫搞的 ...

#include <stdio.h>

#ifdef DBG
# define M_TRACE printf
#else
# define M_TRACE (void)
#endif

int main()
{
M_TRACE("asdf");
M_TRACE( "%d %d\n" , 1 , 2 );
}
pengcar 2006-03-23
  • 打赏
  • 举报
回复
看来各个编译器的区别太大了,我真正要用的是TCC, 是ARM ADS里的编译器,以为在GCC里编译过了,TCC就能过呢.结果GCC和TCC的编译结果还不一样.真晕啊!
楼上的方法看预编译文件的方法很好,很直观.长知识.
林雨亭 2006-03-23
  • 打赏
  • 举报
回复
俺测了一下,
M_TRACE("TEST")在调试版过不去,不是在Release版过不去,
因为M_TRACE("TEST") 变成了 trace("Test", );

应该这样定义
#define M_TRACE( ...) trace( __VA_ARGS__)
另外,告诉你,如果你有Gcc的版本,用 gcc -E -DDEBUG xx.c > xx.pc
可以看到在xx.pc中是预编译后文件,对于判断宏错误有很大的帮助。
以上。
pengcar 2006-03-23
  • 打赏
  • 举报
回复
sorry 上面的
M_TRACE("TEST = %d %d", 2)
少写了一个参数.应该是M_TRACE("TEST = %d %d", 1, 2)..
pengcar 2006-03-23
  • 打赏
  • 举报
回复
其实事情的原委是这样的,有一个类似于printf的语句,功能是输出一些调试信息.如下:
void trace(const char *format, ...)
{
...
}

想定义一个宏,用编译开关控制是DEBUG版还是RELEASE版.如果是DEBUG版,则调用trace函数,如果是RELEASE版,就什么都不调.
最先开始是这么写的.
#ifdef DEBUG
#define M_TRACE(format, ...) trace(format, __VA_ARGS__)
#else
#define M_TRACE(format, ...)
#endif

但是如上定义如果是DEBUG的没问题可以正常工作,但如果是RELEASE版的话,程序中例如M_TRACE("TEST")的调用就编译不过了,说和宏的参数不匹配,但是M_TRACE("TEST = %d", 1),M_TRACE("TEST = %d %d", 2)等都能通过,很奇怪.
所以后来想把M_TRACE在RELEASE版的时候定义成注释.例如
#ifdef DEBUG
#define M_TRACE trace
#else
#define M_TRACE /##/##/
#endif
VC上可以搞定,但是GCC下编译不过.
各位有什么高见解决这个问题?一经测试通过立刻给分(编译环境GCC).谢谢啦!
firetoucher 2006-03-22
  • 打赏
  • 举报
回复
这里是C/C++ C语言,所以我认为--mission impossiable



FT
--
Anything one man can imagine, other men can make real.
iamcaicainiao 2006-03-22
  • 打赏
  • 举报
回复
beside /##/##/, I dont't know other ideas. mark & up.
firetoucher 2006-03-22
  • 打赏
  • 举报
回复
VC这个怪物里是可以。
但是,这是不太符合C标准的。所以GCC下不过非常正常。
正如下面的语句,按标准里的规定应该是语法错误,而不应该是一个正常的注释。但VC中不是。

#define glue(x,y) x##y
glue(/,/) k(); // syntax error, not comment


FT
--
Anything one man can imagine, other men can make real.
pengcar 2006-03-22
  • 打赏
  • 举报
回复
goodluckyxl:
VC下确实可以用,我刚也写出来了.
但是gcc下编译不过.
在我这确实比较有用.
goodluckyxl 2006-03-22
  • 打赏
  • 举报
回复
这没什么难的
#define MACRO_TEST(a) /##/##a
不过我实在搞不懂这么做有什么意义啊
比注释还不直观
pengcar 2006-03-22
  • 打赏
  • 举报
回复
xiao_fang:
MFC中有类似的宏定义吗?在哪?
laofang 2006-03-22
  • 打赏
  • 举报
回复
这样编译通不过吧,看看MFC中是怎样处理的
pengcar 2006-03-22
  • 打赏
  • 举报
回复
helpme422:编译都不过啊,就算过了展开之后也不是注释符//啊.
helpme422 2006-03-22
  • 打赏
  • 举报
回复
MACRO_TEST(c) /\
/ c

69,371

社区成员

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

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