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



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

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

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

然后执行后,错误来了,foo是不可访问的,这是显而易见的,但是有什么我可以做的?比如使用朋友关键字或其他什么?

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

任何帮助将不胜感激。

编辑:上面的解释似乎不能很好地解释我需要什么,我想要的是,我已经创建了我的头文件,我在其中创建了一个类,其中有几个函数,但是有一个函数有相当大的机会抛出异常当我要使用这个函数时,包括头文件,我想知道在哪一行,在哪个函数中,异常发生了,这就是为什么我要创建这个函数名的宏,然后扩展成另一个函数,它有三个参数(函数,文件和行),但我不想让用户使用这个函数,因为这些参数不是我函数的一部分,它们只是打印错误。这就是我把这个函数设为私有的原因这样用户就不能访问它。我在调用函数,创建类对象方面没有任何问题,我只是想知道一件事我们可以创建一个宏它接受参数然后扩展为类的私有函数或不呢?

我搜索了很多关于这个,我认为这是不可能的。但也许我错过了什么?或者如果这是不可能的,那么有没有其他的方法,我可以打印调用函数的行号,因为如果你使用__LINE__,它会打印行号,而不是函数调用的行号。例如,假设有一个函数fun(),它的代码位于第5行作为cout<<__LINE__<<endl;,我调用这个函数fun()从main在第15行但是当它被调用时,它会输出5,这并没有错,但是我不想输出5,我想在调用函数的地方输出15。所以,如果有任何其他方法来实现这一点,请告诉我。

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

与使用宏的方式完全相同。要调用需要对象的方法,只能通过类范围内的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
}

没有宏可以改变这个。

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

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

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

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

但是它仍然会导致错误,因为foo是私有的,你必须把它设为公共的。

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

也许你不需要一个类Temp,你可以使void foo(...)一个自由的函数?

最新更新