Для того, чтобы какой-то код компилировать в C и C++ Я использую это в нескольких местах:Возможно ли реализовать тип GNU C (x) с помощью C11's _Generic?
#ifdef __cplusplus
#define typeof(x) decltype(x) // works ok in most cases, except C++ reference types
#endif
char* a = (typeof(a)) malloc(4);
В C, это компилирует char* a = (char *) malloc(4)
где литая является абсолютно ненужным, но в C++ void *
не неявно назначен char *
и ошибка выдается, если литой нет.
Это так же хорошо, когда я могу скомпилировать с -std=gnu11
на GCC или Clang, но что, когда я хочу, чтобы мой код был скомпилирован как ISO C11? Я думал, что я мог бы использовать _Generic
C11 для реализации typeof(x)
бросить несколько типов:
#define gettype(x) _Generic((x), \
short: (short), \
char: (char ), \
char*: (char *), \
default: (void *) )
int main (void) {
short a = (gettype(a)) 1;
return a;
}
Но независимо от того, какой тип определен в gettype(x)
дается в декларации a
«s,
typeof.h: In function ‘main’:
typeof.h:2:24: error: expected expression before ‘,’ token
short: (short), \
^
typeof.h:8:13: note: in expansion of macro ‘gettype’
char a = (gettype(a)) 1;
^~~~~~~
typeof.h:8:25: error: expected ‘,’ or ‘;’ before numeric constant
char a = (gettype(a)) 1;
gcc -E
говорит, что линия расширяется просто отлично:
short a = (_Generic((a), short: (short), char: (char), char*: (char *), default: (void *))) 1; ^
Есть ли какой-то синтаксис, который у меня отсутствует, или я s это просто невозможно в C для генерации кода с использованием _Generic
?
Хотя '_Generic' вряд ли можно использовать вне макроса, он не может быть частью препроцессора. Таким образом, он не может обеспечить замену текста. – Olaf
Было бы лучше обеспечить полную совместимость с C и совместимость с C++, чем отсутствие совместимости с C и C++. – user694733
@ user694733 спасибо за вашу критику, но я уверен, что этот код будет только скомпилирован как C с GCC или Clang - совместимость с C++ для MSVC, которая едва поддерживает C90. – cat