【问题标题】:C++ move/remove symbolC++ 移动/删除符号
【发布时间】:2012-10-24 10:42:33
【问题描述】:

假设我有一个.cpp 文件,其中我必须包含一个声明某个符号的第三方头文件(我们称之为div)。我不需要这个符号,但我需要定义我自己的div 符号。但是,原始符号可能会被头文件的其他部分使用。是否可以从全局命名空间中删除符号(类似于 undefing 宏)?

我想要这样的东西:

#include <string> //stdlib.h defines div symbol
//do some symbol removal magic here
std::string div;

使用带有-std=c++11 选项的gcc-4.7/clang 进行编译。

【问题讨论】:

  • 为什么不在命名空间中的 lib 中声明名称?
  • 因为这样我每次都必须使用命名空间名称来限定它,我宁愿避免这种情况。
  • 除了懒惰之外,你不想使用命名空间还有其他原因吗?
  • 而这种懒惰可能是您的第 3 方标头污染全局命名空间的原因......
  • 所以你的反对意见是你不能用你的名字污染全局命名空间,因为标准库已经做到了。对不起,这里很少同情。 使用命名空间;这就是他们的目的。

标签: c++ c++11


【解决方案1】:

您不能从定义符号的命名空间(包括全局命名空间)中删除符号。

将您自己的div 包装在您自己的命名空间中。

【讨论】:

  • 在命名空间中包装我的符号不会从全局命名空间中删除之前的定义。
【解决方案2】:

基本上,没有

但正如其他人所说,您可以使用命名空间来获得与实际上本质上完全不同的符号相同的效果。

【讨论】:

    【解决方案3】:

    我从未使用过,但您可以尝试使用GNU objcopy(如https://stackoverflow.com/a/1950629/721929 中的建议)。

    但我认为,如果您可以控制源代码,则可以避免这种情况。测试这是否有效将花费大量时间。

    --redefine-sym old=new
    Change the name of a symbol old, to new. This can be useful when one is 
    trying link two things together for which you have no source, 
    and there are name collisions. 
    
    objcopy --redefine-sym oldNew=newNew libBlue.a
    

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2013-10-08
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多