c:4:25: error: expected identifier or '(' before '{' token

c:4:25: error: expected identifier or '(' before '{' token

我试图通过使用宏在 C 中实现类似模板的功能,但出于某种原因,它抛出错误“c:4:25: 错误:预期标识符或‘(’在‘{’标记之前”。 =11=]

这是代码

#include<stdio.h>
#include<stdlib.h>
#define test(name, type){\
    typedef struct{\
        type x;\
        type y;\
    }name;\
}
test(IntVec2, int);
int main(){
    printf("Hello, World!");
}

删除括号解决了问题,因为 {typedef...} 不是 Mat 在评论中所述的有效声明。

调试此类情况的一种方法是查看预处理器的输出。例如,我们通过 cpp 预处理器提供以下内容:

#define test(name, type){\
    typedef struct{\
        type x;\
        type y;\
    }name;\
}
test(IntVec2, int);

(我省略了部分代码)

cpp 程序的结果类似于:

# 0 "test.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "test.c"

{ typedef struct{ int x; int y; }IntVec2;};

现在很明显第一个 { 和最后一个 } 不应该出现在宏定义中。

因此:

#define test(name, type)\
    typedef struct{\
        type x;\
        type y;\
    }name;
test(IntVec2, int);

现在导致:

# 0 "test.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "test.c"

typedef struct{ int x; int y; }IntVec2;;

请注意,即使现​​在,末尾的 ; 也已过时(但在这种特定情况下相对无害。在宏定义中使用 ; 时要非常小心。