在mcpp.exe --help中
Options available with only -@std (default) option:
-@compat Expand recursive macro more than Standard.
-3 Enable trigraphs.
-K **Output macro annotations embedding in comments.**那么,“注释中的宏注释”是什么意思呢?
http://mcpp.sourceforge.net/
发布于 2011-09-05 11:07:36
从SourceForge上提供的mcpp-summary-272.pdf文件(有问题的链接):
还提供了一种输出嵌入在注释中的宏信息的模式。此模式允许您从预处理输出中获知宏调用及其在源文件上的位置。
因此,它会留下标识展开的宏的注释,这样您就可以知道哪个源来自哪个宏。
插图
源(x.c)
#include <assert.h>
int main(int argc, char **argv)
{
assert(argc != 0 && argv != 0);
return 0;
}mcpp x.c
#line 1 "/Users/jleffler/src/cmd/x.c"
#line 1 "/usr/include/assert.h"
#line 42 "/usr/include/assert.h"
#line 1 "/usr/include/sys/cdefs.h"
#line 417 "/usr/include/sys/cdefs.h"
#line 1 "/usr/include/sys/_symbol_aliasing.h"
#line 418 "/usr/include/sys/cdefs.h"
#line 494 "/usr/include/sys/cdefs.h"
#line 1 "/usr/include/sys/_posix_availability.h"
#line 495 "/usr/include/sys/cdefs.h"
#line 43 "/usr/include/assert.h"
#line 61 "/usr/include/assert.h"
void abort(void) ;
int printf(const char * , ...);
#line 2 "/Users/jleffler/src/cmd/x.c"
int main(int argc, char **argv)
{
((void) ((argc != 0 && argv != 0) ? 0 : ((void)printf ("%s:%u: failed assertion `%s'\n", "/Users/jleffler/src/cmd/x.c" , 4 , "argc != 0 && argv != 0"), abort()) )) ;
return 0;
}mccp -K x.c (摘录)
我省略了大约560行信息不太丰富的输出,但主要代码是:
#line 2 "/Users/jleffler/src/cmd/x.c"
int main(int argc, char **argv)
{
/*<assert 4:5-4:35*//*!assert:0-0 4:12-4:34*/((void) ((/*<assert:0-0*/argc != 0 && argv != 0/*>*/) ? 0 : /*<__assert*//*!__assert:0-0*//*!__assert:0-1*//*!__assert:0-2*/((void)printf ("%s:%u: failed assertion `%s'\n", /*<__assert:0-1*//*<__FILE__*/"/Users/jleffler/src/cmd/x.c"/*>*//*>*/, /*<__assert:0-2*//*<__LINE__*/4/*>*//*>*/, /*<__assert:0-0*//*<assert:0-0*/"argc != 0 && argv != 0"/*>*//*>*/), abort())/*>*/))/*>*/;
return 0;
}或者,将注释分隔为每行一个(手动):
#line 2 "/Users/jleffler/src/cmd/x.c"
int main(int argc, char **argv)
{
/*<assert 4:5-4:35*/
/*!assert:0-0 4:12-4:34*/
((void) ((
/*<assert:0-0*/
argc != 0 && argv != 0
/*>*/
) ? 0 :
/*<__assert*/
/*!__assert:0-0*/
/*!__assert:0-1*/
/*!__assert:0-2*/
((void)printf ("%s:%u: failed assertion `%s'\n",
/*<__assert:0-1*/
/*<__FILE__*/
"/Users/jleffler/src/cmd/x.c"
/*>*/
/*>*/
,
/*<__assert:0-2*/
/*<__LINE__*/
4
/*>*/
/*>*/
,
/*<__assert:0-0*/
/*<assert:0-0*/
"argc != 0 && argv != 0"
/*>*/
/*>*/
), abort())
/*>*/
))
/*>*/
;
return 0;
}assert()宏的这个实现中的错误是什么?
提示: C99标准规定:
§7.2.1.1
assert宏
assert宏将诊断测试放入程序中;它扩展为一个空表达式。执行时,如果表达式(应具有标量类型)为false (即比较等于0),则assert宏将有关失败的特定调用的信息(包括参数文本、源文件名、源行号和封闭函数的名称-后者分别是预处理宏__FILE__和__LINE__的值以及标识符__func__的值)以实现定义的格式写入标准错误流。然后,它调用abort函数。
计算机正在运行MacOS X Lion (10.7.1)。
https://stackoverflow.com/questions/7303532
复制相似问题