请帮助我理解这个带有参数的 C++ 参数声明

Posted

技术标签:

【中文标题】请帮助我理解这个带有参数的 C++ 参数声明【英文标题】:Please help me understand this C++ parameter declaration with an argument 【发布时间】:2012-04-05 00:51:03 【问题描述】:

我每天都使用 ROOT C++ 库 (root.cern.ch),并且在浏览源代码时遇到了这个函数声明:

TString TString::Format(const char *va_(fmt), ...)

    //etc.

可以找到here。

我不明白const char * 如何在其名称中包含参数或括号。 表达式va_(fmt) 稍后用作简单的const char *,尽管它看起来像函数调用或构造函数。起初我认为这与变量参数列表有关,这对我来说也是新的,但是阅读 stdarg.h 上的文档对这个问题一点帮助都没有。

很难通过谷歌搜索来寻求帮助,因为我真的不知道该怎么称呼它。带有参数的声明?这不会产生任何好的结果。

我以前认为我知道 C++,但这里发生了什么?我们将不胜感激。

【问题讨论】:

我猜va_ 只是一个宏。可能除了扩展其参数之外什么都不做。 【参考方案1】:

这是一个宏 - 在Varargs.h:

#if ...
#  define va_(arg) __builtin_va_alist
#else
#  define va_(arg) arg
#endif

【讨论】:

我们告诉 C 程序员 #define 只是混淆,但他们相信我们吗? 没有... ^_- 另一个为什么宏不好的例子。如果fmt 是一个类型,那么语法将是一个函数的有效声明,作为一个名为va_ 的参数,一个指向返回char const * 的函数的指针。 与仅命名参数 va_fmt 相比,这对所讨论的函数有何影响? @leftaroundabout Joe 省略了#if 上的子句。它可能类似于#if SOME_FANCY_OPTIMIZED_STDARG_COMPILER_OPTION_ENABLED。如果启用了精美的编译器选项,则此代码的作用是为您提供TString TString::Format(const char *__builtin_va_alist, ...),否则为您提供TString TString::Format(const char *fmt, ...)。任何地方都没有va_fmt @MikeDeSimone:是的,我知道。问题是,在函数内部,参数只能通过宏调用,没有简单的__builtin_va_listfmt。因此,无论宏扩展为什么,该名称都会出现,隐藏函数外部具有相同名称的任何变量,并且无论名称是什么都会导致完全相同的行为。这就是我的想法,但显然我错过了一些东西。

以上是关于请帮助我理解这个带有参数的 C++ 参数声明的主要内容,如果未能解决你的问题,请参考以下文章

请帮助我理解这个 PL/SQL

python中定义函数时,self怎么理解:

C++ (带有默认参数的函数参数)缺省函数参数

理解复杂的类型脚本类型声明

C++ 如何将命令行参数转换为数组?

关于全局变量和局部变量的理解