Рассмотрим следующую программу:
#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 ++?
Стандарты C89 / C90 и C ++ 98 просто не определяют, как должны обрабатываться пустые аргументы макроса. В результате поведение не было определено пропуском, и предупреждение о времени предварительной обработки или сообщение об ошибке является разумным результатом этого.
C99, как вы заметили, был первым стандартом C, который позволил это сделать, но также стоит упомянуть, что C ++ 11 принял формулировку C99. Так что нет, в C ++ больше не является неопределенным поведением иметь пустые аргументы макроса.
Других решений пока нет …