【发布时间】:2011-02-22 07:59:41
【问题描述】:
可能重复:
C void arguments
我刚从 C 开始,我找不到答案...
有什么区别
int foo() { }
int foo(void) { }
我应该更喜欢哪个,为什么?
请注意,此问题也适用于:int main。当我不想要任何命令行参数时,应该是:int main 或 int main(void)?
【问题讨论】:
标签: c
可能重复:
C void arguments
我刚从 C 开始,我找不到答案...
有什么区别
int foo() { }
int foo(void) { }
我应该更喜欢哪个,为什么?
请注意,此问题也适用于:int main。当我不想要任何命令行参数时,应该是:int main 或 int main(void)?
【问题讨论】:
标签: c
根据标准,main 的两种规范形式是(参见 C99 第 5.1.2.2.2 节“程序启动”):
int main (void);
int main (int argc, char *argv[]); // or equivalent such as char **argv
其他是明确允许的,但那些是必需的。
至于fn(void)和fn()之间的首选形式,我更喜欢前者,因为我喜欢明确声明没有参数。
还有一个细微的差别。 C99 第 6.7.5.3 节“函数声明符”第 10 段指出:
类型为 void 的未命名参数作为列表中唯一项的特殊情况 指定函数没有参数。
同一部分的第 14 段显示了唯一的区别:
标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表指定该函数没有参数。不属于该函数定义的函数声明器中的空列表指定不提供有关参数数量或类型的信息。
换句话说,它的含义与函数定义中的void 相同,但不 意味着在独立的声明符(即原型)中。 int fn(); 表示尚无参数信息,int fn(void); 表示无参数。
这意味着:
int fn();
int fn (int x) { return x; }
int main (void) { return fn(0); }
有效但是:
int fn(void);
int fn (int x) { return x; }
int main (void) { return fn(0); }
不是。
【讨论】:
除了 paxdiablo's reply,它涵盖了 C 语言和 OP 的问题,可能值得注意的是,至少 Bjarne Stroustrup 认为“空样式”在 C++ 中被认为是不好的做法。
原因纯粹是与风格有关,但在 ISO 标准化之前的早期,C++ 中实际上禁止使用 void 作为函数参数。不过最终允许使用 void 语法,以提供与 C 的兼容性。
总结一下:
f(void),因为它强制执行更严格的类型(有理参数)f(),否则你会惹恼各种 C++ 大师(不合理的论点)【讨论】:
不,没有区别。一些旧的 C 编译器会抱怨在这种情况下没有 void,但在现代 C 或 C++ 中没有理由这样做。
【讨论】:
coreutils源代码来查看,但是每个main都有一个命令行参数!
语句之间没有区别。
如果你写int main(void),这个语句告诉编译器main不包含任何参数。
同样,在main() 或int main() 的情况下,编译器再次理解main 不包含任何参数。但是,在第一种情况下,您是在强行告诉编译器,而在第二种情况下,编译器会自动理解。
【讨论】:
无论您是否使用命令行参数,main() 的签名都包括允许访问命令行参数的参数。
将签名视为与调用者的合同,而不是实现实际使用的公告。
【讨论】:
它们是相同的,但首选的是int foo() { }
【讨论】: