使用特定宏时如何禁止调用特定功能

时间:2018-08-24 05:07:01

标签: c++ c++11 macros

我有一个这样定义的宏:

#define SOME_MACRO(Name) \
bool Function#Name()

此宏通常与某些功能一起使用。让我们称它们为foo()。 像这样在多个文件中使用它:

SOME_MACRO(Hello) {
   //do stuff here
   foo();
   //do more stuff here
}

已创建一个调用FOO_MACRO的新宏foo。从现在开始,当人们打电话给SOME_MACRO时,我不希望他们直接打电话给foo()。相反,我希望他们使用FOO_MACRO,在SOME_MACRO之前和之外被称为。

我唯一想到的方法是在对SOME_MACRO的调用中创建一个名为foo的lambda函数。新定义的foo会在调用时输出错误。

SOME_MACRO(Hello) {
   auto foo = [](){
      //error
   };
   foo(); //should generate error
   //do more stuff here
}

我实际上不知道它是否可以编译,但是即使它可以工作,我也必须在每次SOME_MACRO的调用中一个接一个地执行此操作。精疲力尽,代码变得重复。

我尝试过的一件事是将SOME_MACRO的定义更改为以下内容:

#define SOME_MACRO(Name) \
lots of stuff here \
namespace {
   void foo () {}
}
bool Function#Name()

如果我这样做,由于调用的歧义,调用foo将产生编译错误。这实现了我不让人们调用该函数的目标。但是该错误可能会使其他人感到困惑。我希望能够创建一个错误,使他们知道“不要调用foo!请改用FOO_MACRO!”。

还有其他方法可以实现这一目标吗?如果可能的话,我真的不想使用模棱两可的通话错误。

我正在从内存中写入内容,因此示例代码中可能存在语法错误。

1 个答案:

答案 0 :(得分:0)

您可以基于某个宏使用条件#include语句。这将包括对函数的正确定义。

您是否考虑过多态性?这是C宏丑陋的常见C ++答案