返回语句在Visual Studio 2013中需要额外的分号

时间:2015-03-27 14:37:19

标签: c visual-c++ visual-studio-2013

我正在编译Visual C ++ 2013中的一些C代码(它必须用C语言编写)。

void drawDebugLines(vec2f pos, DebugControls *controls, vec2f dydx, vec2f p)
{
    static float lineSize = 0.05f;
    if (!controls->normalFlag && !controls->tangentFlag)
    {
        return;
    }
    vec3f nColor = cVec3f(1, 1, 0);
    ...

按原样,此代码将编译并运行正常。

如果我拿出那些花括号,我会得到以下编译错误:

error C2275: 'vec3f' : illegal use of this type as an expression

编辑:语句vec3f nColor

发生此错误

但是如果我在return语句之后输入了总共两个分号(并且没有大括号),那么代码也会编译并运行得很好。

这只发生在Visual C ++中,gcc将编译此代码而不需要大括号或额外的分号。

我的问题是为什么Visual C ++会这样做?我很高兴接受“Visual Studio的C编译器是s ***”的答案,但是为什么/它是怎么回事?

我应该指出,在我的头文件中,我将所有东西都包裹在里面

#if __cplusplus
extern "C" {
#endif
...
#if __cplusplus
}
#endif

我不确定这是否相关,但我认为我应该提一下以防万一。

编辑:您可以将代码扔进文件并见证神奇的代码:

额外编辑:文件名的扩展名必须为.c,如果是.cpp则代码编译。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct vec3f vec3f;

struct vec3f
{
    float x, y, z;
};

vec3f cVec3f(float x, float y, float z)
{
    vec3f v;
    v.x = x;
    v.y = y;
    v.z = z;
    return v;
}

void drawDebugLines(vec3f pos, bool debug)
{
    if (!debug)
        return;;

    vec3f nColor = cVec3f(1, 1, 0);

    printf("nColor: %f %f %f\n", nColor.x, nColor.y, nColor.z);
}


int main(int argc, char **argv)
{
    vec3f pos = cVec3f(0, 0, 0);
    drawDebugLines(pos, true);

    return EXIT_SUCCESS;
}

拿出额外的分号并观察它是否破裂。如果它没有为你而破坏,只是我的Visual C ++版本失败了,那么说实话,这对我来说是最有意义的。

1 个答案:

答案 0 :(得分:6)

这是Visual Studio 2013中C编译器中的一个错误。它已在Visual Studio 2013 Update 2中修复。