0

「 foo1.h」と「foo2.c 」を含むソースファイル「foo.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 を右クリックして [Go To Declaration] を押すと、foo1.h と foo2.h の両方が表示されることです。したがって、基本的にコンパイラは、MACROFOO が宣言されている場所を認識しています。

Eclipse JUNO v1.5.1を使用しています。

ヘッダー ファイルの 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 に答える