私は、コードに1行のA.hファイルが1つある巨大なプロジェクトに取り組んでいます。
typedef unsigned __int16 Elf64_Half;
また、Linuxでビルドしていて、dlinfo
関数を使用しているので、プロジェクトにlink.h
ファイルを含める必要があります。そして、これは、同じ名前Elf64_Half
を持つ2つのtypedefがあるため、競合が発生する場所です。 (Linux link.h
にはelftypes.h
が含まれており、typedef unsigned short Elf64_Half;
も含まれています)。
そのような場合はどうすればよいですか? a.h
でtypedefを変更するための唯一のオプションはありますか?プロジェクトは巨大で、いくつかの場所で変更を加える必要があるため、簡単ではないことを忘れないでください。
ndef typedefか何かにする方法はありますか?
明確にするために、RahulManneは簡単な解決策を示しました。行う
#define Elf64_Half The_Elf64_Half_I_dont_care
#include<link.h>
#undef Elf64_Half
#include<A.h>
/*
* Code here and use Elf64_Half from A.h as you like.
* However, you can't use Elf64_Half from link.h here
* or you have to call it The_Elf64_Half_I_dont_care.
*
*/
これにより、Elf64_Half
の各link.h
がThe_Elf64_Half_I_dont_care
に置き換えられるため、A.h
との競合は発生しません。 Elf64_Half
のlink.h
を明示的に使用したくない限り、問題なく機能します。このファイルで明示的に使用する必要がある場合に備えて、Elf64_Half
のlink.h
がThe_Elf64_Half_I_dont_care
と呼ばれるようになったことを覚えておく必要があります。
そのような場合はどうすればよいですか?
一般的な解決策は、可視性が最も必要とされないものを「コンパイルファイアウォール」の背後に配置することです。つまり、必要な機能を提供する独自の抽象化/インターフェースを作成し、含まれるファイルの可視性を_*.cpp
_のみに含めることにより、_*.cpp
_に制限します。もちろん、その_*.cpp
_ファイルには、typedef
の他の定義を持つヘッダーを含めることも許可されません。
そうすれば、宣言は同じ翻訳単位に表示されないため、競合が発生することはありません。
あなたの例では、必要なdlinfo()
関数のラッパーを作成する可能性があります。説明する:
DLInfo.hpp
_namespace MON {
class DLInfo {
public:
/* ...declare the necessary public/client functionality here... */
int foo();
...
};
}
_
DLInfo.cpp
_#include "DLInfo.hpp"
// include the headers for dlinfo() here.
// these includes should not be in your project's headers
#include <link.h>
#include <dlfcn.h>
// and define your MON::DLInfo implementation here, with full
// ability to use dlinfo():
int MON::DLInfo::foo() {
...
}
...
_
これが私が理解した小さな回避策です:最初にそれを何か他のものとして定義した場合、後でそれをtypedefすることができます。例のここを参照してください(私はg ++を使用してOSXを使用しています):
#import <iostream>
using namespace std;
typedef unsigned int uint32;
int main() {
cout << sizeof(uint32) << endl;
}
このプログラムの出力は次のとおりです。
4
ここで、この変更されたプログラムについて考えてみましょう。
#import <iostream>
using namespace std;
typedef unsigned int uint32;
#define uint32 blah
typedef unsigned long uint32;
int main() {
cout << sizeof(uint32) << endl;
}
このプログラムの出力は次のとおりです。
8
したがって、質問に答えるには、コードに次の行を追加します。
#define Elf64_Half Elf64_Half_custom
明確にするために、これは基本的にすべての名前を変更しているため機能しますが、自分の名前をすべて変更するのではなく、1つのコマンドで名前を変更します。