社区
C语言
帖子详情
宏定义:展开之后为注释 即//
pengcar
2006-03-22 03:22:55
怎么把一个宏定义成注释?
比如语句MACRO_TEST(123)展开之后变为//(123)
...全文
630
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深度解析》第二章 C预编译——
宏定义
、条件编译、头文件包含、特殊预编译关键字
课程内容: (1)回顾c预编译 (2)
宏定义
:无宏体宏、有宏体宏、带参宏、
宏定义
与复杂表达式。 (3)条件编译:#if、#else、#elif #endif、#ifdef和#ifndef、#if与defined、条件编译与配置文件 (4)一些特殊的预...
C++中用
宏定义
注释
摘要:本文介绍了如何用宏来定义
注释
,以控制是否需要
注释
掉cout。 1. 起心动念 在调试程序的时候,经常需要用cout输出一些内容,以判断程序是否...下面提供一种用一条
宏定义
语句实现
注释
或解
注释
所有cout语句的...
用
宏定义
实现
注释
符号
下面只分析DEBUG未定义的情形,这个
宏定义
实际上是将“DbgPrintf”定义成了“//DbgPrintf”,由于续行符的作用,#define定义时不会发现
注释
符“//”,但是在
展开
到代码
之后
,就成了
注释
符“//”了,也就是说,如果你...
宏定义
有无参数
宏定义
和带参数
宏定义
两种
无参数的
宏定义
的一般形式为 # define 标识符 字符序列 其中# define
之后
的标识符称为
宏定义
名(简称宏名),要求宏名与字符序列之间用空格符分隔。这种
宏定义
要求编译预处理程序将源程序中随后所有的定名的出现...
# 带参数的
宏定义
在
宏定义
中的参数称为“形式参数”,在宏调用中的参数为“实际参数”,这点和函数有些类似 2)对带参数的宏,在
展开
过程中不仅要进行字符串替换,还要用实参去替换形参 3)带参
宏定义
的一般形式为#define 宏名(形参...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章