我有一个这样定义的宏:
#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!”。
还有其他方法可以实现这一目标吗?如果可能的话,我真的不想使用模棱两可的通话错误。
我正在从内存中写入内容,因此示例代码中可能存在语法错误。
答案 0 :(得分:0)
您可以基于某个宏使用条件#include
语句。这将包括对函数的正确定义。
您是否考虑过多态性?这是C宏丑陋的常见C ++答案