Действительно ли неопределенное поведение вызывать макрос с пустыми аргументами в C89 & amp; C ++?

Рассмотрим следующую программу:

#include <iostream>
#define add(s,m,a)  ( s + m + a + 0 )
int main()
{
std::cout<<add(3,4,5)<<'\n';
std::cout<<add(15,30,)<<'\n';
std::cout<<add(10, , 33)<<'\n';
std::cout<<add(10,,)<<'\n';
std::cout<<add(,,)<<'\n';
}

Мой компилятор gcc 4.8.1 выдает следующие предупреждения:

6   23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

7   25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8   21 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8   21 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9   19 [Warning] invoking macro add argument 1: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9   19 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

9   19 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

Я знаю, что C ++ не поддерживает пустые аргументы макросов функций препроцессора. Но C99 позволяет указывать макросы функций препроцессора с пустыми (отсутствующими) аргументами.

(Эта функция, вероятно, будет предоставлена ​​как расширение многими компиляторами C ++, такими как g ++ в приведенном выше случае). Действительно ли поведение программы не определено в соответствии с C89 & Стандарт C ++?

3

Решение

Стандарты C89 / C90 и C ++ 98 просто не определяют, как должны обрабатываться пустые аргументы макроса. В результате поведение не было определено пропуском, и предупреждение о времени предварительной обработки или сообщение об ошибке является разумным результатом этого.

C99, как вы заметили, был первым стандартом C, который позволил это сделать, но также стоит упомянуть, что C ++ 11 принял формулировку C99. Так что нет, в C ++ больше не является неопределенным поведением иметь пустые аргументы макроса.

8

Другие решения

Других решений пока нет …