【问题标题】:How to prohibit call of specific functions when using a certain macro使用某个宏时如何禁止调用特定函数
【发布时间】: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 我只是被告知要禁止使用该功能,并且没有参与创建任何宏,所以我并没有考虑太多。不过,会记住你所说的!谢谢!如果没有出现任何问题,那么是的,我可能不得不采用该解决方案并按照您的建议添加评论。

标签: c++ c++11 macros


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2023-02-07
    • 2023-04-04
    • 2019-06-28
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多