这是我在尝试编译一些使用taucs(而不是我的代码)的代码时遇到的错误:
.../taucs/src/taucs.h:554: error: conflicting declaration ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
.../taucs/src/taucs.h:554: error: ‘taucs_ccs_matrix’ has a previous declaration as ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
笏?它与自身相冲突?
在我捏自己之后,我创建了一个测试标题,并提出了一个相互矛盾的定义,只是为了确保我是对的:
在文件testit.h中:
#include "somethingelse.h"
typedef struct
{
int n;
} foobar;
在文件somethingelse.h中:
typedef struct
{
int n;
} foobar;
果然,我明白了:
testit.h:6: error: conflicting declaration ‘typedef struct foobar foobar’
somethingelse.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
或者如果我在testit.h中有这个:
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
行号始终不同 - 声明不能与自身冲突。我不明白。有人见过这个吗?
答案 0 :(得分:14)
单个标头是否包含在多个源文件中?如果是这样,你需要将它包装在“include guard”中,如下所示:
#ifndef TAUCS_H
#define TAUCS_H
//Header stuff here
#endif //TAUCS_H
答案 1 :(得分:6)
包含声明的头文件(.../taucs/src/taucs.h
)是否(直接或间接)由两个单独的#include
指令包含两次?
答案 2 :(得分:1)
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
在这个例子中,你给出2个foobar声明。编译器不知道选择哪一个 - 因此它会因冲突的声明而失败。你不能两次宣布同一件事。
答案 3 :(得分:0)
不要重复定义。 C ++允许定义只出现一次。你能做的就是重复宣言。
typedef
始终是一个定义。所以我建议的第一件事就是给struct
一个正确的名称(因为这是C ++,一个typedef不会增加任何好处所以只需删除typedef):
// file1.h
struct foobar
{
int n;
};
接下来,这应该只是一个文件。如果你的文件只使用指向foobar的指针,你可以重复声明(只是不是定义):
// file2.h
// This is just a declaration so this can appear as many times as
// you want
struct foobar;
void doit(const foobar *f);
答案 4 :(得分:0)
我有同样的问题linting我的代码,它是不类型的双重声明。 PC-Lint抱怨在混合C和C ++代码中使用了相同的typedef。我可以通过避免C 和 C ++文件中的相同声明来解决这个问题。希望有所帮助。