'typeof'之前的预期表达式或'typeof'之前预期的primary-expression

时间:2016-04-06 08:49:38

标签: c gcc macros

我有一个像这样的宏:

#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);
  ^

3 个答案:

答案 0 :(得分:7)

我认为您不能使用 typeof 来测试类型相等性。如果查看gcc manualtypeof (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;
}