如何取消一个 C/C++ 的符号的定义

by

C++ 是一个玄妙得令人抓狂的语言,我今天遇到了一个需要取消定义一个已经定义了的类型的需求。

假定我们有一个辣鸡头文件 notstddef.h, 它令人不可饶恕地把 size_t 硬编码成了 32 位的版本:

typedef unsigned int size_t;

然后我们有这样的代码(实际上是 new 里的,这里简化了情况):

#include <notstddef.h>

auto operator new(std::size_t __sz) -> void * {
  // 奇奇怪怪的实现
}

然后我们在 64 位下编译就报错啦,说什么参数类型要不得呀。

我现在希望在不修改头文件的情况下取消 size_t 的定义,然后我在 栈溢出 查到了这么一个用法:

#define size_t __size_t__place__holder__
#include <notstddef.h>
#undef size_t

typedef unsigned long size_t;

auto operator new(std::size_t __sz) -> void * {
  // 玄妙的实现
}

根据需求,你可以利用 __size_t__place__holder__ 的值做一些事情。

看起来很强的样子,至少我这个 C++ 苦手是不知道这种操作的。


Tweet this
Top


创建一个 issue 以申请评论
Create an issue to apply for commentary


协议/License

本作品 如何取消一个 C/C++ 的符号的定义 采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,基于 http://ice1000.org/2018/06/04/HowToUndef/ 上的作品创作。
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
知识共享许可协议