有没有办法重新定义结构?

时间:2015-06-15 00:41:34

标签: c

我没有尝试使用两个具有相同名称的不同结构,而是在两个不同的时间(可能在不同的头文件中)定义相同的结构。

例如:

struct foo {
    int bar;
};

struct foo {
    int bar;
};

给出错误。

5 个答案:

答案 0 :(得分:2)

这样做绝对没有意义。如果您有一个供多个编译单元使用的结构,请将其放在.h头文件中,并#include来自那些.c文件。或者,如果您需要多个头文件,只需包含那些公共头文件。

现在,如果你不需要实际的结构定义,而只需要声明它存在(所以你可以创建指向所述struture的指针),你可以使用转发声明

 struct foo;    // defined elsewhere

 void somefunc(struct foo *ptr);

答案 1 :(得分:2)

简答:否

编译器并不那么聪明 - 你已经拥有struct foo,所以即使你认为它与第一个struct foo相同,你也不能拥有另一个RewriteCond %{QUERY_STRING} (^|\?)mode=thread&id=([0-9]+)($|&) RewriteRule ^index\.php$ http://mywebsite.com/threads/%2/? [R=301,L]

答案 2 :(得分:1)

你应该在另一个标题中分隔结构,听起来你可能正在组织你的代码,并且应该重新考虑设计。

您可以使用ifndef:

#ifndef NAMEDEF
struct name {
int val;
};
#define NAMEDEF
#endif

尽管如此,我必须重申您需要重新考虑头文件的设计方式,并将此结构放在一个公共标题中。

也可以使用前瞻声明:

struct name;

void function() {
}

答案 3 :(得分:1)

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

#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语言中不允许这样做;但是,你可以做一些接近非完全重新定义的事情。我建议避免使用它们,因为它们往往只会使代码更加模糊和难以维护。

答案 4 :(得分:-2)

更改名称或不在一个源文件中使用这两个头文件。命名空间中缺少C编程语言,如果它不是静态的,那么一切都是GLOBAL。

另一种方法是使用宏。但对于真实的项目来说,事情可能过于复杂。

#define foo FOO2
struct foo {
  int bar;
};

#undef foo
struct foo {
  int bar;
};