为什么在每个函数的开头使用常量char指针?

时间:2016-08-19 14:54:15

标签: c++

第一行功能的目的是什么?

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; 
}

`

在经验丰富的人员设计的代码中,每个地方都使用此功能,无需打印宏。它有什么诀窍吗?

2 个答案:

答案 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 ++的设计选择,如果你想要一个明确的答案,你需要询问编写代码的具体人员。