C: MSDN表示“可以为函数指针提供默认参数”,这是真的吗?

4
考虑这篇MSDN文章(“默认参数”)以及以下代码:

这里

#include <stdio.h>

void print(int x) {
  printf("%d\n", x + 537);
}

typedef void (*Func)(int x = 0);

int main() {
  Func f = print;
  f();
  return 0;
}

文章称“可以为指向函数的指针提供默认参数。例如:int (*pShowIntVal)( int i = 0 );”。我理解是上述代码应该能够成功编译。但是,实际上并不行:
a.cpp
a.cpp(7) : error C2383: 'Func' : default-arguments are not allowed on this symbol
a.cpp(11) : error C2198: 'Func' : too few arguments for call

看来我误解了这篇文章。它的重点是什么,正确的解释是什么?


我甚至不能在代码中只说int (*pShowIntVal)( int i = 0 );!“错误2383:'pShowIntVal':不允许此符号使用默认参数”。 - Earth Engine
1个回答

3

默认参数是函数声明的一部分,但不是其类型的一部分。因此,您可以编写:

void f(int x = 0);

但是f的类型仍然是这样的
void(int x)

因此,函数指针类型不能包含默认参数。
(参考:§ 8.3.6/9 [dcl.fct.default]:“默认参数不是函数类型的一部分。”)

1
微软的代码是胡言乱语,实际上是无效的C++代码。 - Earth Engine
@EarthEngine 似乎是这种情况。 - user554180
@EarthEngine:正确。曾经gcc可以接受指针和typedefs中的默认参数,但这已经被弃用十年了。我不知道VC++的情况。 - rici
我在微软的资料中看到的是指针变量有一个默认参数。类型不受影响。这可以解释为什么页面上的代码可以工作,而typedef则不行。 - cHao
@cHao 相信我,我已经尝试将这行代码 int (*pShowIntVal)( int i = 0 ); 加入到我的程序中,但在 VS2013 中它无法编译通过。 - Earth Engine
那么这似乎是文档中的错误。可能应该向微软或其他相关方报告。 - cHao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接