在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.**
那么,“评论中的宏观注释”是什么意思?
答案 0 :(得分:1)
来自SourceForge上提供的mcpp-summary-272.pdf文件(相关链接):
另外 mcpp有一个输出宏信息的模式 嵌入评论中。此模式允许您 了解宏调用及其在源上的位置 来自预处理输出的文件。
因此,它留下了标识扩展的宏的注释,以便您可以确定哪个源来自哪个宏。
#include <assert.h>
int main(int argc, char **argv)
{
assert(argc != 0 && argv != 0);
return 0;
}
#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;
}
我省略了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
宏将诊断测试放入程序中;它扩展为void表达式。 执行时,如果表达式(应具有标量类型)为false(即, 比较等于0),assert
宏写入有关特定调用的信息 失败(包括参数的文本,源文件的名称,源代码行 number和封闭函数的名称 - 后者分别是值的值 预处理宏__FILE__
和__LINE__
以及标识符__func__
)在实现定义格式的标准错误流上。它 然后调用abort
函数。
该机器正在运行MacOS X Lion(10.7.1)。