0

我有一个源文件 ' foo.c ',其中包括 ' foo1.h ' 和 ' foo2.c '。

foo1.h

#include "pthread.h"

#define MACROFOO() PTHREAD_MUTEX_INITIALIZER
// Few other macros

foo2.h

#include "pthread.h"

#define MACROFOO() PTHREAD_MUTEX_INITIALIZER
// Few other macros

foo.c

#include "foo1.h"
#include "foo2.h"

typedef struct mut
{
    pthread_mutex_t mut;
    int state;
}strMut;

strMut->mutex = MACROFOO();

当我编译 foo.c 文件时,编译器说MACROFOO无法解析。MACROFOO在 foo1.h 和 foo2.h 中都声明了,我已经在 foo.c 中包含了两个头文件

我在这些头文件中几乎没有其他宏,因此我必须包含两个头文件。

这里的神奇之处在于,当我右键单击源文件中的 MACROFOO 并按“转到声明”时,会显示 foo1.h 和 foo2.h。所以基本上编译器知道 MACROFOO 是在哪里声明的。

我正在使用Eclipse JUNO v1.5.1

我试图从一个头文件中删除 MACROFOO,但问题仍然存在。(但是我不认为从任何头文件中删除 MACROFOO)。

有什么帮助吗?提前致谢。

4

1 回答 1

3

该语法#include <header.h>用于指示库头,#include "header.h"用于本地、用户定义的头。pthread.h最有可能是指同名的POSIX线程库,而不是项目中的本地头文件。

更改#include "pthread.h"#include <pthread.h>查看是否可以解决问题。

此外,您应该始终使用标头保护来避免各种链接器错误:

#ifndef MY_HEADER_H
#define MY_HEADER_H

/* the whole contents of the header file here */

#endif /* MY_HEADER_H */
于 2013-03-15T07:41:18.830 回答