【问题标题】:Strange syntax error C2143 in Visual only (missing ';' before 'type')仅 Visual 中的奇怪语法错误 C2143(在 'type' 之前缺少 ';')
【发布时间】:2013-05-26 18:58:21
【问题描述】:

我收到一个奇怪的编译错误,它仅适用于 MSVC 中的 C 代码。更准确地说:

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

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

这是一个示例代码:

#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语法。

是吗?

【问题讨论】:

  • 我也可以使用llvm-gcc

标签: c visual-studio macros syntax-error c-preprocessor


【解决方案1】:

在 ALLOCATE_ONSTACK 宏定义的末尾以及调用的末尾都有一个分号。这意味着您在每次宏展开后实际上都有一个空语句。因此,第二个扩展不在块的开头。

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

我建议重写你的宏定义,不带分号。

编辑:一拳打出。

【讨论】:

  • 谢谢,确实是一样的答案。我将从宏中删除分号。
【解决方案2】:

好的,这个比较复杂。

看看

#define ALLOCATE_ONSTACK(stateName)

它以; 字符结尾。

现在看看你的代码:

ALLOCATE_ONSTACK(state1);

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

由于 MSVC 不是 C99,它要求所有声明都在块的开头完成。由于您有两个 ';' 字符紧随其后,它的作用就像声明区域已结束。所以,当你声明其他变量时:

ALLOCATE_ONSTACK(state2);

然后失败,语法错误。

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

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

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

【讨论】:

  • 这绝对是令人费解的...... :) 感谢您的明确解释。现在选择删除分号的位置...
  • 哪个更好,我投了第一个,去掉';'在宏的末尾,cus' 这使得源代码看起来更合理是吗? :)
  • @billhoo : 是的,我同意 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2013-07-30
  • 2019-07-07
相关资源
最近更新 更多