The first one (?:) is not standard but only a GNU extension, so be carefull with that one.
C99: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf (post-publication ‘draft’ including technical corrigenda 1–3)
C11: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (final draft as voted on)
Similarly for C++:
C++11: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n333...
C++14: http://open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pd...
gcc -std=c99 -pedanticThe issue that was called out, however, was the use of "FOO(x, ## __VA_ARGS__)".
GNU C has an extension that causes the ',' to be removed if __VA_ARGS__ is empty. AFAIK, it is not standard.