第一行功能的目的是什么?
void foo::bar()
{
const char * function_name = "bar"; // <<< WHY??
/* Code */
/* More Code */
/* Waiting for function_name to be used !!!*/
/* Wow it is totally useless?*/
return;
}
`
在经验丰富的人员设计的代码中,每个地方都使用此功能,无需打印宏。它有什么诀窍吗?
答案 0 :(得分:3)
我怀疑这个程序的头文件包含某个自定义assert
宏读取内容
#define fooco_assert(expr) \
((void) ((expr) || \
fooco_assert_failed(#expr, __FILE__, __LINE__, function_name)))
extern int fooco_assert_failed(const char *expr, const char *srcfile,
int lineno, const char *fnname);
为了支持这一点,作者制定了一个样式规则,即在每个函数的开头都会有function_name
的定义,以便将来可以添加{{1}的调用。必要时无需考虑fooco_assert
是否可用。正如您所注意到的,除非实际使用它们,否则编译器不会将字符串发送到已编译的程序中,因此它不是一个效率问题。
当然, 是用于读取和编辑程序的速度块。 C ++ 11编译器提供了一个名为__func__
的预定义变量,其中包含当前函数的名称;这可以用来代替。此功能在1999年被添加到 C 标准中,许多C ++编译器几乎立即采用了它。其他C ++编译器没有function_name
但是具有等效的专有扩展,例如__func__
。请注意,这些是不是宏;
__FUNCTION__
不会检测#ifndef __func__
#define __func__ "<unavailable>"
#endif
是否可用。你不得不做这样的事情(在我的头顶,根本没有测试):
__func__
答案 1 :(得分:2)
有可能在某一时刻,该函数的代码如下所示:
const char * function_name = "bar";
Loggers::get_logger() << "Entered function " << function_name << "\n";
作为编写企业代码的人,我经常看到这样的结构。也许日志被删除或是元编程模板的一部分,虽然考虑到它使用const char *
来存储字符串,但我必须假设代码已经很老了。
无论如何,这段代码没有任何特定于C ++的设计选择,如果你想要一个明确的答案,你需要询问编写代码的具体人员。