首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mcpp中,“宏注释嵌入注释”是什么意思?

在mcpp中,“宏注释嵌入注释”是什么意思?
EN

Stack Overflow用户
提问于 2011-09-05 10:57:15
回答 1查看 339关注 0票数 3

mcpp.exe --help

代码语言:javascript
复制
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/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-05 11:07:36

从SourceForge上提供的mcpp-summary-272.pdf文件(有问题的链接):

还提供了一种输出嵌入在注释中的宏信息的模式。此模式允许您从预处理输出中获知宏调用及其在源文件上的位置。

因此,它会留下标识展开的宏的注释,这样您就可以知道哪个源来自哪个宏。

插图

源(x.c)

代码语言:javascript
复制
#include <assert.h>
int main(int argc, char **argv)
{
    assert(argc != 0 && argv != 0);
    return 0;
}

mcpp x.c

代码语言:javascript
复制
#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行信息不太丰富的输出,但主要代码是:

代码语言:javascript
复制
#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;
}

或者,将注释分隔为每行一个(手动):

代码语言:javascript
复制
#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)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7303532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档