仅在Visual中出现奇怪的语法错误C2143(在';类型';之前缺少&&';)

仅在Visual中出现奇怪的语法错误C2143(在';类型';之前缺少&&';),c,visual-studio,macros,syntax-error,c-preprocessor,C,Visual Studio,Macros,Syntax Error,C Preprocessor,我得到一个奇怪的编译错误,只在MSVC中编译C代码。更准确地说: 错误C2143:语法错误:缺少“;”在“类型”之前 C2143是一个相当普遍的错误,围绕它有无数的问题,但到目前为止似乎没有一个适用。 最接近的一个可能是,并强调在块的开头声明变量的重要性,这似乎在这里得到了尊重 下面是一个示例代码: #define NB_LL 6 typedef struct { long long ll[NB_LL ]; } stateSpace_t; #define ALLOCATE_ONSTA

我得到一个奇怪的编译错误,只在MSVC中编译C代码。更准确地说:

错误C2143:语法错误:缺少“;”在“类型”之前

C2143是一个相当普遍的错误,围绕它有无数的问题,但到目前为止似乎没有一个适用。 最接近的一个可能是,并强调在块的开头声明变量的重要性,这似乎在这里得到了尊重

下面是一个示例代码:

#define       NB_LL 6
typedef struct { long long ll[NB_LL ]; } stateSpace_t;
#define ALLOCATE_ONSTACK(stateName)  stateSpace_t stateName##_s; void* stateName = (void*) &(stateName##_s);
以下代码运行良好:

void f1()
{
    ALLOCATE_ONSTACK(state1);
    /* do something */
}
这个没有:

void f2()
{
    ALLOCATE_ONSTACK(state1);
    ALLOCATE_ONSTACK(state2);   // <--- error C2143: syntax error : missing ';' before 'type'
    /* do something */
}
void f2()
{
分配(状态1);

ALLOCATE_ONSTACK(state2);//在ALLOCATE_ONSTACK宏定义的末尾和调用的末尾都有一个分号。这意味着在每次宏展开后都有一个空语句。因此,第二次展开不在块的开头

典型地,C要求所有声明在第一个非声明语句之前出现在一个块中。gcc放宽了这一要求,这样错误就不会发生

我建议重写宏定义,不使用尾随分号


编辑:按打孔顺序打。

好的,这一个相当复杂

看这张照片

#define ALLOCATE_ONSTACK(stateName)
它以
字符结尾

现在看看您的代码:

ALLOCATE_ONSTACK(state1);
它还以一个
';'
字符结尾。这意味着,在这一行中,您有两个
';'
字符

由于MSVC不是C99,它要求在块的开头进行所有声明。由于后面紧跟着两个
';
字符,它的作用就像声明区域已结束一样。因此,在中声明其他变量时:

ALLOCATE_ONSTACK(state2);
然后失败,语法错误

GCC没有这样的问题,因为它是C99

请删除宏末尾或源代码中的
;”
字符。只需要一个字符。不确定哪种解决方案更好


[编辑]:正如评论和其他答案中所建议的,从宏中删除分号看起来是更好的解决方案。

使用
llvm gcc
对我来说也很好。谢谢,确实是相同的答案。我将从宏中删除分号。这肯定很复杂…:)感谢您的清晰解释。现在选择删除分号的位置。。。哪一个更好,我投票赞成第一个,只需删除宏末尾的“;”,cus“这使源代码看起来更合理,是吗?”)@billhoo:是的,我支持:)