【问题标题】:"Overloading" a Macro With a `#define` Constant使用 `#define` 常量“重载”宏
【发布时间】:2016-03-04 21:20:44
【问题描述】:

我正在尝试执行以下操作:

//Bad; can't redefine macros; uses later definition.
#define foo          )
#define foo(arg) ,arg)

也就是说,我希望foo(注意:不是宏函数)映射到一个事物,我希望宏函数foo(arg) 映射到另一个事物。所以foo 需要是一些映射到 . . .东西。


我还没有想出办法,(因为这是一个宏和一个常数,许多previous questions 不适用)。 我该怎么做?

Evil 编译器/平台特定选项也很棒。为 C 宏标记此 ,尽管我使用的是 C++14。


旁注(根据要求):这可以用于例如为new 制作您自己的调试重载,这也适用于placement new:

#define new new(__FILE__,__LINE__ foo
//...
void const* p1 = new       int();
void const* p2 = new (ptr) int();

【问题讨论】:

  • 你能描述这样一个要求的原因吗?
  • 您能再描述一下需求吗?我似乎明白你在问什么,但不太明白你的问题的“)”和“,arg)”部分的意思。
  • @EugeneSh。没有老鼠洞很难,但我添加了一个简短的例子。
  • 为什么他们需要同名?我不明白意图是什么。也许如果你描述了你试图用这个解决的问题?

标签: c c macros


【解决方案1】:

您似乎正在寻找一个预处理器,它对 function-(带有参数)和 object-like(普通的#defines)宏具有不同的名称空间 - 我不知道'不知道有什么会这样,如果有的话,我想这会从根本上令人困惑。

我知道你想要类似的东西(注意这实际上不是试图提供解决方案)

// NOTE: Example might work in some very trivial use cases
#ifdef DEBUG
#define new(x) new(x);lognew(__FILE__,__LINE__)  
#define pnew(p,x) new (p) (x); lognew(__FILE__,__LINE__)
#else
#define new(x) new(x)
#define pnew(p,x) new(p) (x)
#endif

并且 pnew 和 new 应该使用相同的关键字。不,我认为这是不可能的(我很高兴它不是;))。

【讨论】:

  • 目前接受这个答案,因为它声称这是不可能的。这也是我的结论。如果有人想出办法,我会接受。
【解决方案2】:

具有变量签名的函数只允许在 C++ 中使用,称为“函数重载”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2012-09-11
    • 2013-10-23
    • 1970-01-01
    • 2012-03-28
    • 2023-02-09
    相关资源
    最近更新 更多