繁体   English   中英

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

[英]Strange syntax error C2143 in Visual only (missing ';' before 'type')

我在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 */
}

第二个代码适用于GCC,所以问题似乎仅限于MSVC。 我的理解是宏ALLOCATE_ONSTACK()只做变量声明和初始化,所以它似乎尊重C语法。

是吗?

好的,这个很复杂。

看着那(这

#define ALLOCATE_ONSTACK(stateName)

它结束于; 字符。

现在看看你的代码:

ALLOCATE_ONSTACK(state1);

它也以';'结尾 字符。 这意味着,在这个特定的行上,你有2个';' 字符。

由于MSVC不是C99,因此它要求所有声明都在块的开头完成。 既然你有两个';' 字符跟随彼此,就像声明区域结束一样。 因此,当您在其中声明其他变量时:

ALLOCATE_ONSTACK(state2);

然后失败,语法错误。

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

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

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

您在ALLOCATE_ONSTACK宏定义的末尾以及调用结束时都有一个分号。 这意味着您在每次宏扩展后都有效地使用null语句。 因此,第二次扩展不在块的开头。

传统上,C要求所有声明都在第一个非声明语句之前的块中发生。 gcc放宽了这个要求,因此不会发生错误。

我建议重写你的宏定义,而不要使用尾随分号。

编辑:击败拳。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM