C 有没有重新定义结构的方法?

C 有没有重新定义结构的方法?,c,C,我并不是想让两个不同的结构具有相同的名称,而是在两个不同的时间(可能在不同的头文件中)定义相同的结构 例如: struct foo { int bar; }; struct foo { int bar; }; 给出错误。否。 这样做毫无意义。如果您的结构将由多个编译单元使用,请将其放入.h头文件中,并从这些.c文件中包含它。或者,如果您需要在多个头文件中使用它,只需包含这些头文件中的公共头文件即可 现在,如果您不需要实际的结构定义,而只需要声明它存在(这样您就可以创建指向所述

我并不是想让两个不同的结构具有相同的名称,而是在两个不同的时间(可能在不同的头文件中)定义相同的结构

例如:

struct foo {
    int bar;
};

struct foo {
    int bar;
};
给出错误。

否。

这样做毫无意义。如果您的结构将由多个编译单元使用,请将其放入
.h
头文件中,并从这些
.c
文件中包含它。或者,如果您需要在多个头文件中使用它,只需包含这些头文件中的公共头文件即可

现在,如果您不需要实际的结构定义,而只需要声明它存在(这样您就可以创建指向所述结构的指针),那么可以使用前向声明:

struct name;

void function() {
}
否。

这样做毫无意义。如果您的结构将由多个编译单元使用,请将其放入
.h
头文件中,并从这些
.c
文件中包含它。或者,如果您需要在多个头文件中使用它,只需包含这些头文件中的公共头文件即可

现在,如果您不需要实际的结构定义,而只需要声明它存在(这样您就可以创建指向所述结构的指针),那么可以使用前向声明:

struct name;

void function() {
}
简短回答:没有

编译器没有那么聪明-你已经有了
struct foo
,所以你不能有另一个
struct foo
,即使你认为它与第一个相同。

简短回答:没有

编译器没有那么聪明-你已经有了
struct foo
,所以你不能有另一个
struct foo
,即使你认为它与第一个相同。

没有。

您应该在另一个标题中分离结构,听起来您可能组织代码很差,应该重新考虑设计

您可以使用ifndef:

#ifndef NAMEDEF
struct name {
int val;
};
#define NAMEDEF
#endif
不过,我必须重申,您需要重新考虑头文件的设计方式,并将此结构放在公共头文件中

也可以使用前言声明:

struct name;

void function() {
}
否。

您应该在另一个标题中分离结构,听起来您可能组织代码很差,应该重新考虑设计

您可以使用ifndef:

#ifndef NAMEDEF
struct name {
int val;
};
#define NAMEDEF
#endif
不过,我必须重申,您需要重新考虑头文件的设计方式,并将此结构放在公共头文件中

也可以使用前言声明:

struct name;

void function() {
}

实现这一点的方法是用预处理器指令包围结构

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */
这只能定义一次struct foo。结合普遍接受的将此类项目放入名为
foo.h
的文件的做法,如下所示

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H

struct foo {
    int bar;
};

#endif /* INCLUDE_FOO_H */
它还可以防止有人这样做

#include "foo.h"
#include "foo.h"

(rest of code)

就重新定义结构而言,这在C语言中是不允许的;但是,您可以执行一些近似于非完全重定义的操作。我建议避免使用它们,因为它们只会使代码更加晦涩和难以维护。

这样做的方法是用预处理器指令包围结构

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */
这只能定义一次struct foo。结合普遍接受的将此类项目放入名为
foo.h
的文件的做法,如下所示

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H

struct foo {
    int bar;
};

#endif /* INCLUDE_FOO_H */
它还可以防止有人这样做

#include "foo.h"
#include "foo.h"

(rest of code)

就重新定义结构而言,这在C语言中是不允许的;但是,您可以执行一些近似于非完全重定义的操作。我建议避免使用它们,因为它们只会使代码变得更加模糊和难以维护。

从标题中删除
C
,因为你已经有了这样的标签:)你到底想解决什么问题?这不是问题吗?()从你的标题中删除了
C
,因为你已经有了一个标签:)你到底想解决什么问题?这不是问题吗?()如果以前已将
name
定义为宏或其他对象,则会导致问题。2) 它将拒绝使用该结构,因为之后出现的每一个
name
都将被替换为。但是您关于标题的观点可能值得详细阐述。我打算在define中使用所有大写字母,以防止与结构的名称冲突。我刚刚纠正了这一点。这不仅是上限,但,是的,这将工作。顺便说一句,它被称为guard,与用于头文件的名称相同。更像是黑客,而不是干净的解决方案;如果
name
以前已经定义为宏或其他对象,那么这将导致问题。2) 它将拒绝使用该结构,因为之后出现的每一个
name
都将被替换为。但是您关于标题的观点可能值得详细阐述。我打算在define中使用所有大写字母,以防止与结构的名称冲突。我刚刚纠正了这一点。这不仅是上限,但,是的,这将工作。顺便说一句,它被称为guard,与用于头文件的名称相同。更像是黑客,而不是干净的解决方案;这应该是一个简单的标题(它会有它的保护)。@谁知道你从来没有指出你的用例是什么,所以我们不可能知道。@谁知道你从来没有指出你的用例是什么,所以我们不可能知道。我不明白这一点。当您只是“担心”不能在多个位置包含同一个结构时,只需一个防护就足够了。为同一个宏设置两个防护装置有什么意义?第二个是多余的,可以在这里省略。第二个守卫无法处理,因此您的示例缺少OP的意图。除非OP询问“如何防止重新定义”,然后询问“如何实际重新定义结构”。我不明白这一点。当您只是“担心”不能在多个位置包含同一个结构时,只需一个防护就足够了。有两个瓜尔豆有什么意义