Мы просто должны расширить макро. Вы можете использовать gcc -E
для вызова только препроцессора; он также расширит все директивы #include
, поэтому выход будет уродливым.
Но давайте сделаем это вручную. Аргументы макроса представляют собой последовательности токенов, а не выражения.
Макрос определение:
# define _2a(list,a1,a2) list a1;a2;
и призывание является:
main _2a((argc,argv), int argc, char * argv[])
{
...
}
Аргументы:
list
->(argc,argv)
a1
->int argc
a2
->char * argv[]
Выполнение замены дает нам:
main (argc,argv) int argc; char * argv[];
{
...
}
Это чаще быть написано на нескольких строках:
main(argc, argv)
int argc;
char *argv[];
{
...
}
Это старый -style Объявление функции.Он по-прежнему легален во всех версиях C (вплоть до стандарта 2011 года), но с 1989 года он официально устарел. Недостатком этой старой формы является то, что она не передавала информацию о параметрах вызывающим, поэтому компилятор не мог предупредите, если вы вызвали функцию с неправильным количеством типов аргументов.
Держу пари, что есть альтернативное определение _a2
макроса, который расширяется к более современному определению, которое включает прототип, что-то вроде:
#define _2a(list,a1,a2) (a1, a2)
С этим макроопределением, определение main
вместо расширяется до этого :
main (int argc, char * argv[])
{
...
}
Так _a2
макросъемки («а», предположительно означает «аргумент») позволяет писать код, который может расширить либо для определения функции старого стиля (для компиляторов до ANSI) или для современного определения с прототипом.
разумный способ осуществить это было бы:
#ifdef __STDC__
#define _2a(list,a1,a2) (a1, a2)
#else
#define _2a(list,a1,a2) list a1;a2;
#endif
Но так как вы вряд ли найти C компилятор, который не поддерживает прототипы (они были стандартной функцией языка уже четверть века), было бы разумнее просто полностью удалить макрос и просто использовать декларации и определения функций современного стиля.
Кроме того, в определении main
отсутствует тип возврата int
. До стандарта 1999 года было законным опускать возвращаемый тип в соответствии с «неявным int
». Стандарт 1999 года отклонил это правило и сделал явный тип возврата обязательным. Большинство компиляторов C в режиме по умолчанию по-прежнему позволяют исключить тип возвращаемого значения, возможно, с предупреждением, но нет никаких оснований его пропускать.
'_2a' скорее всего макрос, определенный в каком-либо файле заголовка. –
Возможно, '_2a' - это макрос. –
Хорошая подсказка - я могу видеть определение макроса. Я обновляю вопрос. – Stefan