【发布时间】:2020-03-22 06:27:23
【问题描述】:
我并不是说这是一种好的编程风格,但令我惊讶的是,它已编译 [*] 并毫无怨言地运行:
#include <stdio.h>
// define function signature
typedef int (*proto_fn)();
int x() { return 22; }
// Note: type name and formal parameter name are the same
void printit(proto_fn proto_fn) {
printf("%d\n", proto_fn());
}
int main() {
printit(x);
return 0;
}
除了可能使人类感到困惑之外,C 标准中是否有任何内容禁止对类型和形参使用相同的名称?
[*](在本例中为 Apple clang 版本 11.0.0 (clang-1100.0.33.8)。)
【问题讨论】:
-
我认为这与 K 或 R 写的著名的问题有关:“大家都同意这里的冰很薄。”
-
函数参数定义后,该函数中的名称
proto_fn不再是类型而是变量,因此不能使用类型名称proto_fn声明另一个指向函数的指针函数的主体。顺便提一下,指针不是原型的——不是严格的原型。函数的参数数量是固定的,而不是可变的,但类型是未指定的。使用typedef int (*proto_fn)(void);为不带参数的函数提供原型。 (x()和main()的定义都没有提供原型。) -
使用
-Wshadow来获取有关隐藏变量和类型的警告。注意警告。但你所做的是合法的——不可取,但合法。 -
@JonathanLeffler:“请注意,指针不是......严格原型化。......使用
typedef int (*proto_fn)(void);为不带参数的函数提供原型。”归档在“我今天学到的一件新事物”下——谢谢。