0

十分な答えを検索しましたが、どの解決策も私にはうまくいきません。

シナリオ:いくつかの関数が宣言されている(定義されていない)といくつかの変数が宣言されている.hファイルをインクルードしようとしています。

このヘッダーファイルを、実際に関数と変数を使用するソースファイル(正確には2つ)にインクルードすると、最後にコンパイルされるものに、次のようなリンカーエラーが発生します。

`abc :: myfun(char const *、char const *、char *)'への未定義の参照

ヘッダーファイル内のすべての関数と変数はexternとして宣言されており、インクルードガードが存在します。

1つのcppファイルで.hファイルで定義された変数に値を入れ、別のcppファイルでそれを読み取れるようにしたいと思います。

また、それが役立つ場合は、コードのすべての部分が、私が定義した名前空間にあります(namespace abc{ //all my code, in all the files }

4

2 に答える 2

3

ファイル内の宣言はまさにそれを行っています- 「どこか」で宣言することを計画しているオブジェクトをコンパイラーに.h知らせます。その「どこか」は、その変数が定義されるコンパイル単位(またはファイル)になります。.c.cpp

以下に例を示します (簡単にするためにガードを省略しています)。

foo.h:

extern int global_foo;

foo.c:

#include "foo.h"
int global_foo; // optionally you can initialize like this: int global_foo = 123;

main.c:

#include "foo.h"
void bar()
{
  global_foo = 0; // accessing that variable which is "outside" of this file

水田が上で述べたように -abc::somethingと同じではないので、誤って名前空間をネストしていないことを確認してくださいabc::abc::something

于 2012-08-22T00:35:25.320 に答える
0

あなたのエラーは にあるようabc::myfun(char const*, char const*, char*)です。これを再現して確認することができました。2番目の部分がないと、エラーが発生します。

次のようなヘッダーファイルがあると思います

namespace abc 
{
    void myfun(char const* p1, char const* p2, char* p3);
}

および .cpp ソース ファイルが必要です

namespace abc
{
    void myfun(char const* p1, char const* p2, char* p3)
    {
        // do fun stuff
    }
}
于 2012-08-22T02:11:51.243 に答える