为什么在可执行语句之后声明变量不能与MS C编译器一起使用?

0 c compiler-errors

这是我的代码中的一部分,这给我带来了很多麻烦:

struct _RandomPermutationIterator
{
    size_t n, *arrp;
    size_t i;
};

typedef struct _RandomPermutationIterator RandomPermutationIterator;

RandomPermutationIterator *RandomPermutationIterator_alloc(size_t n)
{
    srand(time(NULL));
    RandomPermutationIterator *its = (RandomPermutationIterator*)malloc(sizeof(RandomPermutationIterator));
    …
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误:

  • error C2275: 'RandomPermutationIterator' : illegal use of this type as an expression.

  • error C2065: 'its' : undeclared identifier.

有人可以向我解释并告诉我我做错了什么吗?

Jon*_*ler 6

从错误消息编号判断,您使用MS Visual C++作为C编译器.它支持C89,而不支持C99或C11.您无法在可执行语句之后定义变量(与C++或C99或更高版本不同).

在你的outline函数中,srand()调用是一个可执行语句; 之后你不能声明变量.

"明显的"修复是将调用移到srand()变量定义之后.但是,正确的解决方法是删除srand(time(NULL));呼叫 - 您应该(通常)只srand()在给定进程中调用一次.

顺便提一下,以下划线和另一个下划线或大写字母开头的标识符保留供实现使用.这意味着你应该不是自己使用它们.只需删除前导下划线; typedef名称和标记名称位于不同的名称空间中,因此您可以很好地使用:

typedef struct RandomPermutationIterator RandomPermutationIterator;
Run Code Online (Sandbox Code Playgroud)