c - 为什么在可执行语句后声明变量不适用于 MS C 编译器?

标签 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));
    …
}

我收到的错误:

  • error C2275:“RandomPermutationIterator”:非法使用此类型作为表达式。

  • 错误 C2065:“其”:未声明的标识符。

谁能给我解释一下并告诉我哪里做错了?

最佳答案

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

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

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

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

typedef struct RandomPermutationIterator RandomPermutationIterator;

关于c - 为什么在可执行语句后声明变量不适用于 MS C 编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936604/

相关文章:

c - 链表直到第二次迭代才添加节点

c - 在 C 中搜索结构

java - 未处理的异常类型 ClassNotFoundException

compilation - Raspberry Pi : undefined references to COMXImage and g_OMXImage上的XBMC 13.2链接器错误

c++ - 如何配置 Codeblocks 在程序完成后不关闭控制台?

c++ - 聚合初始化,将成员指针设置为相同的结构成员

c - C 中的格式说明符不明确

c - 对 `FindTheVolumeAndSurfaceArea' 的 undefined reference

visual-studio-2013 - 在另一个项目中找不到 C# 类型或命名空间名称

actionscript-3 - 为什么不导入此类? AS3