如何查找函数在编译时是否为静态函数
How to find if function is static at compile time
我有日志记录宏,它记录函数的这个指针,但问题是当记录静态函数中使用的宏时,它没有这个指针,我得到编译错误。
例如
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 所建议的那样,开发人员有责任是否传递这个。
现在,我不会支持上面例子的质量,只会支持它所要表达的精神。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 关于std::move的使用,是否有编译警告
- 标准是否严格定义了该程序应该如何编译?
- 是否可以在编译时限制类的实例数?
- 检查编译时是否存在静态函数
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- std::less是否应该允许在编译时比较不相关的指针?
- 编译时检查特征专用化是否具有唯一 ID
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何确定integer_sequence在编译时是否包含给定的数字?
- 知道模板参数在编译时是否为 const char*?
- 全局变量在 C++ 中是否显着提高了编译速度?
- 检查该类在编译时C++中是否有任何基类
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 在 Xubuntu 19.04 中编译 c++ 是否应该与在 Ubuntu 18.04 中编译 c++ 不同
- 为什么要编译?(编译是否忽略未包含的 h 文件?
- C++/编译:是否可以设置VPTR(全局vtable + 2字节索引)的大小
- 使用-g本身进行编译是否会降低性能?