说一下这个基础知识 | 每日一面(67)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:能否混用旧式的和新型的函数语法?

小林:这样做是合法的。但是, 现代的做法是在声明和定义的时候都是用原型形式。旧式的语法被认为已经废弃, 所以某一天对它的官方支持可能会取消。

读者:为什么声明 extern int f(struct x *p); 报出了一个奇怪的警告信息 “结构 x 在参数列表中声明”?

小林:与C语言通常的作用范围规则大相径庭的是, 在原型中第一次声明 的结构不能和同一源文件中的其它结构兼容, 它在原型的结束出就超出了作用范围。要解决这个问题, 在同一源文件的原型之前放上这样的声明:struct x;它在文件范围内提供了一个不完整的结构 x 的声明, 这样, 后续的用到结构x的声明至少能够确定它们引用的是同一个结构 x。

读者:我不明白为什么我不能象这样在初始化和数组维度中使用常量:

const int n = 5; int a[n];

小林:const 限定词真正的含义是 “只读的”; 用它限定的对象是运行时 不能被赋值的对象。因此用 const 限定的对象的值并不完全是一个真正的常量。在这点上 C 和 C++ 不一样。如果你需要真正的运行时常量, 使用预定义宏 #define(或enum)。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完