【问题标题】:Please help me understand this C++ parameter declaration with an argument请帮助我理解这个带有参数的 C++ 参数声明
【发布时间】: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_ 只是一个宏。可能除了扩展其参数之外什么都不做。

标签: c++ syntax arguments function-declaration


【解决方案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。因此,无论宏扩展为什么,该名称都会出现,隐藏函数外部具有相同名称的任何变量,并且无论名称是什么都会导致完全相同的行为。这就是我的想法,但显然我错过了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多