请帮助我理解这个带有参数的 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_list
或fmt
。因此,无论宏扩展为什么,该名称都会出现,隐藏函数外部具有相同名称的任何变量,并且无论名称是什么都会导致完全相同的行为。这就是我的想法,但显然我错过了一些东西。以上是关于请帮助我理解这个带有参数的 C++ 参数声明的主要内容,如果未能解决你的问题,请参考以下文章