5 c legacy parameters coding-style
在学习 The Unix Programming Environment (1983) 一书中的一些例子时,我读了一些对我来说很奇怪的 C 代码。
出于好奇,我想了解更多关于“风格”的信息,我们称之为“风格”。这里的兴趣点是下面的线int main(argc, argv)
#include <stdio.h>
int main(argc, argv)
char *argv[];
{
printf("%s\n", argv[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的调查中,我发现使用标志编译上面的代码可以在-Wall -pedantic -ansi没有任何警告的情况下工作,并且替换-ansi为更新的-std=c99(或c11, withgcc和cc)只会警告argc默认为int.
我仔细阅读了旧的 C89 标准,试图找到对这种特殊写作方式的引用,但我自己没有找到任何东西,所以我遵循集体的更多知识。
因此,问题是,这种深奥的写作从什么时候开始,可能为什么仍然允许(遗留原因?)
旧的做事方式是使用没有原型的函数。函数int默认返回,并且由于函数参数类型在调用站点上是未知的,因此您最好正确使用。这使您不必维护头文件,但由于各种原因,不再推荐它。
// In func.c
// Default to int return
func(x, y)
int x;
int y;
{
return x + y;
}
// In main.c
main(argc, argv)
int argc;
char **argv;
{
int result = func(2, 3);
}
Run Code Online (Sandbox Code Playgroud)
如果函数参数类型错误,这会导致问题。
int result = func(2.0, 3,0); // Wrong, but no compiler error or warning
Run Code Online (Sandbox Code Playgroud)
在不包含相关头文件的情况下调用函数是正常的。但是需要声明函数返回类型。
// This is NOT a function prototype, it just declares the return type.
double sin();
double one = sin(3.14); // Correct
double zero = sin(0); // WRONG
double zero = sin(0.0); // Correct
Run Code Online (Sandbox Code Playgroud)
标准仍然允许旧式函数,除了默认的返回类型消失了。这允许您编译旧程序。对于新程序,-Wmissing-prototypesGCC 中的选项可帮助您避免意外使用旧样式。
int func(); // Old-style, can take any number of arguments.
int func(void); // New-style, takes no arguments, is a function prototype.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1188 次 |
| 最近记录: |