【问题标题】:How to assign value to __func__ in C?如何在 C 中为 __func__ 赋值?
【发布时间】:2017-05-27 05:35:46
【问题描述】:

由于某种原因,我在文档的任何地方都没有找到这个问题的直接答案。

我的朋友说我可以直接使用__func__ 并分配给它,而无需实际声明它。

documentation 说:

1. The identifier __func__ shall be implicitly declared by the translator as
if, immediately following the opening brace of each function definition, the
declaration

    static const char __func__[] = "function-name";

appeared, where function-name is the name of the lexically-enclosing function.

那么,这是否意味着,每次我以static const char __func__[] = "function-name"; 而不是strcpy(__func__, "function-name"); 开始函数时,我都应该声明它,因为它已经被声明并将由编译器处理?

如果这听起来像一个基本问题,我很抱歉,但我很困惑!

【问题讨论】:

  • 好吧,你不能给它赋值,因为它是一个 const 数组......
  • 文档提到了分配字符串的 translator。你为什么假设自己是翻译者
  • 是的,当我现在阅读它时,我意识到我听起来多么愚蠢。
  • 否;你没有声明它——它是由翻译器隐式声明的(意思是“编译器”)。不;你不能修改它——它被声明为const。有趣的是,GCC 和 Clang 都不允许你在函数的内部块中重新定义 __func__,但它给出的错误不是很连贯(error: expected identifier or ‘(’ before ‘__func__’,但将 __func__ 更改为 __function__ 并且代码编译)。 OTOH,无论如何,您都不应该尝试这种技巧。
  • @JonathanLeffler 可能 gcc 以某种方式将 __func__ 替换为字符串文字,而不是声明的变量。如果您编写int __func__;,您将得到与编写int "hello"; 时相同的编译器错误。不过,这个字符串文字似乎具有 const char* 类型,而不是像常规字符串文字那样的 char*

标签: c char constants variable-assignment


【解决方案1】:

您不需要声明或定义它。它在函数定义中对您的代码隐式可用。

void func_with_fancy_name() 
{
  puts(__func__); // Will print the function name
}

分配是另一回事。你不能这样做。 “好像”声明中的 const 说明符应该会阻止您。

【讨论】:

  • printf("%s", __func__); 会更好,以防名称修改将% 插入函数名称。
  • @KenY-N - 是的,我正在考虑这个问题。转而使用puts,而不是三思而后行。
  • @KenY-N 我认为在编译器为__func__ 赋值之前不允许发生名称修改,否则编译器将不遵循标准要求。 __func__ 必须给出函数的确切标识符名称。
【解决方案2】:

我的朋友说我可以直接使用__func__ [...]

是的,你可以。注意这部分

[...] 应由译者隐式声明为 if,紧跟在每个函数定义的左大括号之后, 声明

static const char __func__[] = "function-name";

出现了,[...]

所以,你不需要明确。

.. 并分配给它,

不,你不能。这是一个常数。

【讨论】:

  • 我刚刚再次阅读了文档中的那一行,现在突然变得如此有意义!我觉得自己像个白痴:/
  • 这种“快速阅读”文档的经历发生在我们所有人身上(不止一次)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2020-07-20
  • 2022-01-17
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多