取消在C + +的typedef?

我正在一个巨大的项目,其中有一个文件啊,其代码有一行

typedef unsigned __int16 Elf64_Half; 

另外,因为我在Linux上构build和使用dlinfo函数,所以我必须在我的项目中包含link.h文件。 这是它创build冲突的地方,因为我有两个具有相同名称Elf64_Halftypes定义。 (Linux link.h包含elftypes.h,它也有: typedef unsigned short Elf64_Half; )。

我在这种情况下做什么? 是我唯一的select,改变我的typedef啊? 请记住,这不是太容易,因为项目是巨大的,我将不得不在几个地方做出改变。

有没有办法undef typedef或什么的?

Solutions Collecting From Web of "取消在C + +的typedef?"

为了澄清,Rahul Manne提供了一个简单的解决方案。 做

 #define Elf64_Half The_Elf64_Half_I_dont_care #include<link.h> #undef Elf64_Half #include<Ah> /* * Code here and use Elf64_Half from Ah 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. * */ 

这将会替换link.h中的每个Elf64_Half和The_Elf64_Half_I_dont_care,因此你不会和Ah发生冲突只要你不想使用link.h的Elf64_Half就可以毫无问题地工作。 您只需要记住,link.h中的Elf64_Half现在称为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() { ... } ... 

这里有一个小小的解决方法,我想通了:如果你先定义它,那么你可以稍后输入它。 在这个例子中看到(我在OS X上使用g ++):

 #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 

为了清楚起见,这是有效的,因为你基本上是把它们全部重命名,但是用一个命令来完成,而不必改变你自己的全部名字。