web-dev-qa-db-ja.com

C ++でtypedefの定義を解除しますか?

私は、コードに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か何かにする方法はありますか?

16
voidMainReturn

明確にするために、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.hThe_Elf64_Half_I_dont_careに置き換えられるため、A.hとの競合は発生しません。 Elf64_Halflink.hを明示的に使用したくない限り、問題なく機能します。このファイルで明示的に使用する必要がある場合に備えて、Elf64_Halflink.hThe_Elf64_Half_I_dont_careと呼ばれるようになったことを覚えておく必要があります。

18
imix

そのような場合はどうすればよいですか?

一般的な解決策は、可視性が最も必要とされないものを「コンパイルファイアウォール」の背後に配置することです。つまり、必要な機能を提供する独自の抽象化/インターフェースを作成し、含まれるファイルの可視性を_*.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() {
 ...
}

...
_
7
justin

これが私が理解した小さな回避策です:最初にそれを何か他のものとして定義した場合、後でそれを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つのコマンドで名前を変更します。

6
Rahul Manne