在某些库中我使用(用C语言编写)它
StorePGM(image, width, height, filename)
char *image;
int width, height;
char *filename;
{
// something something
}
Run Code Online (Sandbox Code Playgroud)
所有功能都以这种方式定义.我一生中从未见过这样的功能定义.它们似乎对MSVC有效,但当我将其编译为C++时,它会产生错误.
它是什么?某种旧版C?
在1989 ANSI C标准之前,C没有原型(指定参数类型的函数声明); 这些旧式的声明和定义都是可用的.
1989年,ANSI C标准(基本上成为1990 ISO C标准)引入了原型.如果我没记错的话,这个想法实际上来自C++(当时还没有标准化).旧式声明和定义仍然合法,因此旧代码仍然可以编译.1989年的标准还说旧式声明是"过时的",这意味着它们可以在未来版本的标准中删除.
1999年的ISO C标准(正式)取代了1990年的标准,仅此一项; 旧式声明和定义仍然是合法的,并且所有符合要求的编译器必须支持它们(尽管它们可以自由地警告它们,因为它们可以警告其他任何事情).
截至最新的C201X草案(大型PDF),这仍然没有改变.旧式函数声明和定义仍然是语言的必需部分,所有符合条件的编译器都必须支持它们.(就个人而言,我认为这很不幸.)
另一方面,C++从未(?)支持除原型之外的任何函数声明; Stroustrup并不关心如何保持与旧C代码的兼容性.
但除非您需要维护非常旧的代码和/或使用非常旧的编译器,否则没有充分的理由使用旧式函数声明或定义.
注意,至少在C中,这个定义:
int main() {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
实际上是一种旧式的定义.它对C++来说是正确的,它是一个原型,表明它main没有参数,但在C中它应该是
int main(void) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
(C++也接受这种形式与C兼容 - 但是当你写作时main,你应该已经决定使用哪种语言.)
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |