C语言 - 限制结构体作用域

6
我有一个.c文件中的这个结构:
struct entry {
    int position;
    int length;
    struct entry *node;
};

现在,我该如何将这个结构体 layout 的作用范围限制在主机文件中,以便在另一个文件中使用相同的名称来定义新的结构体 layout 时,不会出现“重新定义”的错误?
我尝试在 struct 前面使用 static,但似乎没有用(也没有意义)。顺便说一下,this question 对我来说似乎无效,因为当在链接的文件之间复制 stuct entry 时(使用 MinGW),我会收到“重新定义”的错误。
--- 编辑 ---
想了解更多信息的人可以看 这里这里

你能展示一下当你尝试编译/链接程序时显示的确切错误信息吗? - unkulunkulu
错误:重新定义了“struct entry”。这是因为我将该文件包含到另一个使用相同名称的文件中。看起来这是一个逻辑错误,即将设计与实现隔离开来,其中翻译单元只需要通过头文件进行通信,而不是直接通信。 - Ghasan غسان
2个回答

9
您不会收到重新定义错误。类型是局部于“翻译单元”的,并且没有任何可见性。只有函数和数据对象具有可见性。
如果您收到重新定义错误,那么您必须在头文件或其他包含的文件中使用该名称,以便它最终出现在相同的翻译单元中。

2
如果您包含了一个具有相同名称的结构体、联合体或枚举类型的文件,则会出现此问题。 - T.E.D.
这是我的问题:“如果你得到了一个重新定义的错误,那么你一定在头文件或其他包含的文件中使用了该名称,因此它最终会出现在同一个翻译单元中。”非常感谢。 - Ghasan غسان
@ecatmur - 所以这个是错的:http://www.dmst.aueb.gr/dds/cscout/doc/name.html?这并不让我震惊,但确实让我烦恼。我手头没有C99标准来进行双重检查。 - T.E.D.
2
抱歉,我错了;6.2.3 脚注 24: “即使有可能使用三个名称空间,但标签只有一个名称空间。” - ecatmur

2

听起来你想在不同的文件中让struct entry有不同的含义。没问题:只需将每个版本结构体的定义代码放在不同的.c文件中,并确保从一个.c文件中永远不要包含另一个.c文件,也不要从头文件中包含.c文件。

每个翻译单元中只应存在一个结构体定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接