【发布时间】:2018-08-24 05:07:01
【问题描述】:
我有一个或多或少这样定义的宏:
#define SOME_MACRO(Name) \
bool Function#Name()
此宏通常与某些功能一起使用。让我们给其中一个打电话foo()。
它在多个文件中使用,如下所示:
SOME_MACRO(Hello) {
//do stuff here
foo();
//do more stuff here
}
创建了一个调用foo 的新宏FOO_MACRO。从现在开始,当人们拨打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!”。
还有其他方法可以实现吗?如果可能的话,我真的不想使用模棱两可的调用错误。
我是凭记忆写的,所以示例代码中可能存在语法错误。
【问题讨论】:
-
通常在 C 中使用的宏在 C++ 中是个坏主意。原因主要是(AFAIK)每个标识符都是
namespaces 的主题,除了宏。这会产生复杂的错误,有时不容易理解。 (可能是您真的不想阅读的内容。) ;-) 实际上,我认为您的解决方案在您的情况下并没有那么糟糕。如果我没记错的话,我知道的每个编译器都提到了重复符号的两次出现。因此,误用用户很有可能最终出现在SOME_MACRO()的定义中,您可以在其中留下您的意图作为评论。 -
@Scheff 我只是被告知要禁止使用该功能,并且没有参与创建任何宏,所以我并没有考虑太多。不过,会记住你所说的!谢谢!如果没有出现任何问题,那么是的,我可能不得不采用该解决方案并按照您的建议添加评论。