我有一个像这样的宏:
#include <stdio.h>
#include <stddef.h>
#define m_test_type(e) \
do { \
if (typeof(e) == typeof(char [])) { \
printf("type is char []\n"); \
} else \
if (typeof(e) == typeof(int)) { \
printf("type is int\n"); \
} else { \
printf("type is unknown\n"); \
} \
} while (0)
int main() {
char s[] = "hello";
m_test_type(s);
return 0;
}
在使用gcc编译期间,我收到以下错误:
prog.cpp: In function 'int main()':
prog.cpp:6:14: error: expected primary-expression before 'typeof'
if (typeof(e) == typeof(char *)) { \
^
prog.cpp:19:2: note: in expansion of macro 'm_test_type'
m_test_type(s);
^
prog.cpp:6:14: error: expected ')' before 'typeof'
if (typeof(e) == typeof(char *)) { \
^
prog.cpp:19:2: note: in expansion of macro 'm_test_type'
m_test_type(s);
^
prog.cpp:9:14: error: expected primary-expression before 'typeof'
if (typeof(e) == typeof(int)) { \
^
prog.cpp:19:2: note: in expansion of macro 'm_test_type'
m_test_type(s);
^
prog.cpp:9:14: error: expected ')' before 'typeof'
if (typeof(e) == typeof(int)) { \
^
prog.cpp:19:2: note: in expansion of macro 'm_test_type'
m_test_type(s);
^
答案 0 :(得分:7)
我认为您不能使用 typeof 来测试类型相等性。如果查看gcc manual,typeof (expr)
将被表达式的类型静态替换,这允许您声明变量:
int i;
typeof(&i) p;
在这种情况下,最后一条指令将等同于int* p;
但是如果你在if语句中使用typeof
就像你的那样会出错,因为它等同于编写像
if ( char* == char *)
导致错误。
答案 1 :(得分:3)
这不是标准C,因此它只能在GCC设置下编译为非标准编译器。这意味着您可能不应该使用-std=c11
或-pedantic
等选项来进行编译。我不建议这样做。
我会建议摆脱所有非标准的GCC废话并改写纯标准C:
#include <stdio.h>
#define m_test_type(e) \
printf(_Generic((e), \
char*: "type is char*\n", \
int: "type is int\n", \
default: "type is unknown\n" \
));
int main() {
char s[] = "hello";
m_test_type(s);
return 0;
}
答案 2 :(得分:2)
我现在可以使用builtin functions运行此代码:
#include <stdio.h>
#define m_test_type(e) \
do { \
if (__builtin_types_compatible_p(typeof(e), typeof(char []))) { \
printf("type is char []\n"); \
} else \
if (__builtin_types_compatible_p(typeof(e), typeof(int))) { \
printf("type is int\n"); \
} else { \
printf("type is unknown\n"); \
} \
} while (0)
int main() {
const char s[] = "hello";
m_test_type(s);
return 0;
}