我正在编译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 ++版本失败了,那么说实话,这对我来说是最有意义的。