【发布时间】: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