Что означает «вложение макросов в комментарии» в mcpp? - PullRequest
2 голосов
/ 05 сентября 2011

In 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/

1 Ответ

1 голос
/ 05 сентября 2011

Из файла mcpp-summary-272.pdf, доступного на SourceForge (ссылка на вопрос):

Также в mcpp есть режим вывода макроинформации, встроенной в комментарии.Этот режим позволяет вам узнать вызовы макросов и их расположение в исходном файле из предварительно обработанного вывода.

Таким образом, он оставляет комментарии, идентифицирующие макросы, раскрытые, чтобы вы могли определить, какой источник поступил из какого макроса.

Иллюстрация

Источник (xc)

#include <assert.h>
int main(int argc, char **argv)
{
    assert(argc != 0 && argv != 0);
    return 0;
}

mcpp xc

#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 xc (отрывок)

Я пропустил около 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).

...