社区
C语言
帖子详情
宏定义:展开之后为注释 即//
pengcar
2006-03-22 03:22:55
怎么把一个宏定义成注释?
比如语句MACRO_TEST(123)展开之后变为//(123)
...全文
990
17
打赏
收藏
宏定义:展开之后为注释 即//
怎么把一个宏定义成注释? 比如语句MACRO_TEST(123)展开之后变为//(123)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pengcar
2006-03-23
打赏
举报
回复
多谢各位的热心参与.问题很好的解决了.
DiabloWalkOnTheEarth
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
DiabloWalkOnTheEarth
2006-03-23
打赏
举报
回复
我都是酱紫搞的 ...
#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
用
宏定义
实现
注释
符号
本文介绍了如何使用C语言
宏定义
巧妙地实现自动
注释
调试代码。当DEBUG未定义时,通过
宏定义
将DbgPrintf转换为
注释
,避免了在发布状态下不必要的调试代码。这种方式能有效节省运行时间,但需注意宏只能用于单独一行且
注释
符后的“/”需顶格写。
C语言编译问题——
宏定义
不要随便
注释
本文详细解析了在Linux环境下编译代码时遇到的
宏定义
错误,包括invalid storage class for function和expected declaration or statement at end of input等问题,并提供了具体的定位和解决方法,强调了在多行
宏定义
中避免使用//
注释
的重要性。
C++
注释
本文围绕 C++
注释
展开
,介绍了
注释
是方便阅读源代码且不参与编译的文本内容。阐述了单行
注释
、多行
注释
的语法格式,给出示例。还讲解了
注释
源代码的方法,如用多行
注释
、预处理器指令 #if #endif 等,同时指出不能用
宏定义
组成
注释
。
巧用c语言
宏定义
实现自动
注释
调试代码,c语言预处理--
宏定义
本文介绍了C语言中
宏定义
的一些实用技巧,包括宏扩展中空格的影响、如何使用宏进行自动
注释
调试代码以及
宏定义
里
注释
的处理方式。
C语言-多行
宏定义
添加
注释
的方法
本文详细介绍了C语言中多行
宏定义
的使用及
注释
的注意事项。错误地将整行
宏定义
注释
可能导致代码
展开
时的不完整。正确的多行
宏定义
注释
应避免覆盖连接符,可以使用/* */对部分代码进行
注释
。通过示例展示了错误
注释
导致的问题,并提供了正确的
注释
方法。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章