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;;
请注意,即使现在,末尾的 ;
也已过时(但在这种特定情况下相对无害。在宏定义中使用 ;
时要非常小心。
我试图通过使用宏在 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;;
请注意,即使现在,末尾的 ;
也已过时(但在这种特定情况下相对无害。在宏定义中使用 ;
时要非常小心。