在C++中使用一个宏定义另一个宏,然后取消定义(#undef)第一个宏

3
以下代码无法编译:
#define SOME_MACRO(x,y) x+y
#define ADD_ONE_TO(x) SOME_MACRO(x,1)
#undef SOME_MACRO

int main(){
    ADD_ONE_TO(1);
}

有没有什么技巧可以:

  1. 通过在SOME_MACRO中具有常见功能并在其他宏中使用它来避免代码重复,但是通过undef使其不能在常见用户代码中使用。
  2. 以某种方式使ADD_ONE_TO宏只是将它使用的宏复制粘贴而不是引用它们。
  3. 防止用户代码访问和使用SOME_MACRO,但允许在代码的其他特定部分(其他,选择,宏)中使用它。
  4. 通过禁止访问(undef或其他方式)要隐藏宏内部的宏来隐藏宏的实现。

4
我不这么认为。在定义其他宏时,宏不会被展开。只有在使用宏时才会展开所有宏。 - Barmar
3
如果您不希望"用户"看到宏定义,则不要将其提供给用户 - 在私有头文件中定义,或直接在使用它的私有源代码中定义。因为一旦它被公开,"* 用户代码 *"必须能够在编译时解析它,一旦编译器找到它,用户就可以找到它,无论您尝试多么努力地混淆它。在您的示例中,如果允许"用户"看到/使用ADD_ONE_TO,则SOME_MACRO也必须在某个地方定义,否则代码将无法编译。 - dxiv
另外,你实际上想做什么?这似乎是一个xy问题。而且为什么要在C++中使用宏?顺便说一下,学会大量使用括号:像@define SOME_MACRO(x,y) (x+y)这样。 - kesarling He-Him
@d4rk4ng31 我知道会有人这么说。我只是好奇而已。 - Matias Chara
1个回答

2
当使用GNU CPP时,您可以使用#pragma GCC poison,例如:
#include <stdio.h>

#define print(...) printf(__VA_ARGS__)
#pragma GCC poison printf

int
main ()
{
        print("hi, %s", "there!"); /* Ok */
        printf("oh %s", "no!"); /* ERROR! use of poisoned keyword */
}

测试过了,它可以工作!


非常有趣,对于Visual Studio编译器是否有任何解决方案? - Matias Chara
1
很遗憾,这不是一个标准功能。只有clang和GCC支持它。微软的Visual Studio没有相应的功能。抱歉,我不知道你在使用VS。 - Yazan Alsalem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接