【问题标题】:How to use private functions inside macros?如何在宏中使用私有函数?
【发布时间】:2021-10-04 18:13:05
【问题描述】:

我想创建一个宏(获取行号、函数名和文件名),然后将此内容转发给另一个函数,但该函数必须是私有的,但问题是 我不能在内部使用私有函数宏。

例如假设这个 C++ 类在我的头文件中:

class Temp
{
    private:
    void foo(string function, string file, int line)
    {
        // Do something...
    }
    #define func() foo(__FUNCTION__,__FILE__,__LINE__)
}

然后在执行之后,错误出现了 foo 不可访问,这很明显,但是我能做些什么吗?喜欢使用 Friend 关键字或其他什么?

这样做的目的是,当发生异常时(用户定义),我想打印发生异常的行号,并且我不希望用户使用 foo 函数,这就是它私有的原因。我发现您可以使用宏将行号传递给其他函数。另外,假设我的头文件中存在临时类。而且,我正在使用另一个 C++ 文件中的宏 func。

我们将不胜感激。

编辑: 似乎上面的解释并不能很好地解释我需要什么,我想要的是,我已经创建了我的头文件,我在其中创建了一个类,其中的函数很少,但是有一个函数有相当多的机会抛出异常,当我通过包含头文件来使用该函数时,我想知道在哪一行,在哪个函数中发生了异常,这就是为什么我要创建该函数的宏name 然后扩展为另一个函数,该函数还有三个参数(函数、文件和行),但我不希望用户使用这个其他函数,因为这些参数并不是我函数的一部分,它们只是打印错误.所以,这就是为什么我将此功能保持为私有,以便用户无法访问它。 我在调用函数、创建类对象方面没有任何问题,我只想知道一件事,我们可以创建一个接受参数然后扩展为 类的私有函数 的宏吗?

我对此进行了很多搜索,我认为这是不可能的。 但也许我错过了什么?

或者,如果这是不可能的,那么还有其他方法可以打印调用函数的行号,因为如果您使用__LINE__,它将打印该行号而不是函数所在的行号叫。 例如,假设有一个函数 fun(),它在 line 5 的代码为 cout<<__LINE__<<endl;,而我在 line 15 的 main 调用这个函数 fun() >,但是当它被调用时,它会打印5,这没有错但我不想打印5,我希望在我调用函数的地方打印15。 所以,如果有任何其他方法可以实现这一点,请告诉我。

【问题讨论】:

  • 你还需要一个对象来调用成员函数。请发minimal reproducible example,包括你如何使用宏和错误信息
  • 请注意宏不是 C++ 的一部分。它们是 pre 处理构造并在源 text 被解释为 C++ 中的源 code 之前被应用。
  • 你可能不需要宏;在当前 C++ 中使用 std::source_location

标签: c++ macros private-functions


【解决方案1】:

如何在宏中使用私有函数?

与您在不使用宏的情况下使用它们的方式完全相同。要调用需要对象的方法,只能在类范围内通过foo调用(然后在this调用)。另外,因为它是私有的。

这行得通:

#include <string>

#define func() foo(__FUNCTION__,__FILE__,__LINE__)

class Temp {
    void foo(std::string function, std::string file, int line) { }        
public:
    void foo() { 
        func();
    }
};

int main() {
   Temp{}.foo();
}

除了极少数例外,如果没有宏就无法做到,那么使用宏也无法做到。你不能这样调用方法:

int main() {
    foo("main","main.cpp",42);  // no, need object to call member function
    Temp t;
    t.foo("main","main.cpp",42); // no, method is private
}

没有宏可以改变这一点。

【讨论】:

    【解决方案2】:

    将宏定义放在类 Temp 中这一事实并不能使它成为该类的有效方法。当你在任何地方调用它作为 func();然后它将扩展到

     foo("some_function", "file.cpp", 1234); 
    

    这是一个错误,因为您的代码中没有全局 foo() 函数。你想要的是:

    Temp tmp;
    tmp.foo("some_function", "file.cpp", 1234);
    

    但还是会报错,因为 foo 是私有的,你必须把它设为 public。

    您还必须将Temp tmp; 放置在您将使用宏的所有地方都可以看到的地方。

    也许您不需要 Temp 类,您可以将 void foo(...) 设为免费函数?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2021-02-18
      • 1970-01-01
      • 2013-08-05
      • 2015-01-26
      • 2018-11-02
      • 2021-09-19
      相关资源
      最近更新 更多