Из файла 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).