Слишком много фактических параметров для макроса? - PullRequest
4 голосов
/ 09 марта 2011

Код:

#include <iostream>

using namespace std;

#define ADD(x,y)  ((x)+(y))

int main( int argc, char** argv )
{
    cout << ADD(1,2,) << endl;
    return 0;
}

Выход компилятора:

1> Компиляция ...
1> main.cpp
1> c: \ warn_test \ main.cpp (9): предупреждение C4002: слишком много фактических параметров для макроса 'ADD'

Почему это не ошибка?

g++ (GCC) 4.2.1 20070719 [FreeBSD] дает более разумный (на мой взгляд) вывод:

main.cpp: 9: 18: ошибка: макрос «ДОБАВИТЬ» передал 3 аргумента, но принимает всего 2
main.cpp: в функции 'int main (int, char **)':
main.cpp: 9: ошибка: «ADD» не был объявлен в этой области

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

РЕДАКТИРОВАТЬ: Добавлен полный gcc вывод и информация о версии.

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Я собираюсь высказать полное предположение, вдохновленное комментарием Стива Джессопа о том, что это связано с поддержкой вариадных макросов.

Возможно, было легче предупредить, когда команда Visual Studio внедрила вариационные макросы? Я заметил разные уровни толерантности при реализации кода, такие как:

#define MACRO(...) my_func(true, __VA_ARGS__);

MACRO(1,,2); // Missing argument
MACRO(1,); // missing tail
MACRO(); // no arguments

Некоторые ошибки компилятора предупреждают или игнорируют различные ситуации. Я не знаю, что говорит стандарт.

1 голос
/ 09 марта 2011

Полагаю, это выбор компилятора.Если бы был третий параметр, он, возможно, был бы более проблематичным, но поскольку его нет, вы можете поспорить о игнорировании запятой или выдаче ошибки.Microsoft, похоже, часто более устойчива к ошибкам (как при анализе HTML в IE).

1 голос
/ 09 марта 2011

Вы используете ADD(1,2,), обратите внимание на второе ,. Удалите это, и оно будет прекрасно скомпилировано!

@ schnaader: Вы правы, я читаю слишком быстро. К сожалению.

[править] Пожалуйста, предоставьте более подробную информацию о рассматриваемом компиляторе. Я использую: g ++ (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5, и вот результат, который я получаю:

test.cpp:9: error: macro "ADD" passed 3 arguments, but takes just 2
test.cpp: In function ‘int main(int, char**)’:
test.cpp:9: error: ‘ADD’ was not declared in this scope

[edit2] Извините, снова слишком быстро :-). Я вижу, вы отметили это визуальной студией. VS более терпим, чем g ++. Я полагаю, что - поскольку в этом случае это легко разрешить - он автоматически исправляет это.

...