0

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

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

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

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

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

任何帮助将不胜感激。

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

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

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

4

2 回答 2

0

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

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

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

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

但这仍然会导致错误,因为 foo 是私有的,您必须将其公开。

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

也许你不需要一个 Temp 类,你可以做void foo(...)一个免费的功能?

于 2021-10-04T18:22:56.887 回答
0

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

与您在没有宏的情况下使用它们的方式完全相同。要调用需要对象的方法,只能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
}

没有宏可以改变这一点。

于 2021-10-04T18:41:27.953 回答