如何查找函数在编译时是否为静态函数

How to find if function is static at compile time

本文关键字:编译 是否 静态函数 函数 何查找 查找      更新时间:2023-10-16

我有日志记录宏,它记录函数的这个指针,但问题是当记录静态函数中使用的宏时,它没有这个指针,我得到编译错误。

例如

LOG_DEBUG(msg,...) 
   Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, this, msg, ## __VA_ARGS__);

我想知道是否有办法检查当前方法是否是静态的,而不是我可以使用此指针或传递 null 并避免编译错误。

请让我知道 GNU 是否提供任何预定义的宏来确定当前函数是静态的还是任何其他方式。

我会避免尝试自动检测并使其成为开发人员的责任。
只需为没有此值的情况提供另一个日志记录宏。
当您错误地使用 LOG_DEBUG() 时,编译器将生成错误,您可以替换。

LOG_NON_OO_DEBUG(msg,...) 
   Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, msg, ## __VA_ARGS__);

注意:我不会传递 NULL(或 0)。
我会重载 WriteLog() 方法,以便它有一个不需要这个指针的版本。

补充马丁的答案,这是一个编译时结构,而宏是预处理器,因此无法使用宏测试的存在。 在像perl这样不太强类型的语言中,你可以检查符号是否被定义,但由于C/C++是强类型的,所以不需要这样的运算符。

编辑

我想稍微澄清一下我在上一段中试图表达的观点。

预处理器是 Cism。 如果我不得不打赌,它可能只看到了错误修复和对其行为的微小更改,但在其他方面与 20 年前的 C 几乎相同。 换句话说,预处理器不是为处理特定于语言的功能而设计的。

语言功能,如静态这个,调用约定,类型等...预处理器不知道它们,也没有使用它们的逻辑。 唯一可以做到这一点的方法是,如果存在一个语言功能来测试的定义性,或者测试你是否在静态函数中。

/编辑

我倾向于建议您使用非宏方法来记录日志,或者使用不太依赖于宏的解决方案。 我看到使用宏的唯一优点是你不必到处键入__FILE____LINE__。 在这方面,我认为将您提出的任何内容包装在宏中都没有问题。

例如,您可以向类添加一个泛型函数,用于生成一条简短的信息,如下所示:

class MyClass {
  private:
    void MemberLogMsg();
  public:
    static void LogMsg( MyClass* M = NULL);
};

您的宏将始终调用 LogMsg,正如 Martin 所建议的那样,开发人员有责任是否传递这个

现在,我不会支持上面例子的质量,只会支持它所要表达的精神。