什么是更好的:void foo()或void foo(void)?随着虚空,它看起来丑陋和不一致,但我被告知它是好的.这是真的?
编辑:我知道一些旧的编译器做了奇怪的事情,但如果我只使用GCC,那void foo()好吗?将foo(bar);随后被接受?
我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:
int f(void)
Run Code Online (Sandbox Code Playgroud)
我倾向于写作:
int f()
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
Run Code Online (Sandbox Code Playgroud)
派生类包括成员函数:
int f()
Run Code Online (Sandbox Code Playgroud)
这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?
void func()
实际上,空参数表示接受任何参数.
void func(void) 不接受任何争论.
但在标准C99中,我找到了这样的界限:
6.7.5.3函数声明
符(包括原型) 14标识符列表仅声明函数参数的标识符.函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数.函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息.
根据标准,func()并且func(void)是相同的?
我见过带有以下签名的方法:
void foo (void);
Run Code Online (Sandbox Code Playgroud)
他们没有争论,但我想知道这样做是否有用.你有没有理由想要这样做?
可能重复:
在C中定义无参数函数main()的标准方法
我可以在C中使用函数的声明定义,main()如下所示:
int main() {}
Run Code Online (Sandbox Code Playgroud)
是的,我看到标准说只有两个保证支持的版本:
int main(void) {}
Run Code Online (Sandbox Code Playgroud)
和
int main(int argc, char* argv[]) {}
Run Code Online (Sandbox Code Playgroud)
但空洞的做法呢?我知道它有另外的含义而不是C++(在C中,它意味着这个函数的参数的数量和类型是未知的),但我在C中看到了很多带有main 声明定义的代码.
那谁错了?
我在这里读到的是C void foo()手段a function foo taking an unspecified number of arguments of unspecified type.
任何人都可以给我或指向一个C函数采用未指定数量的参数的示例吗?这适用于C什么?我在网上找不到任何东西.
谢谢!
我在教程中读到C++包含整个C编程语言.
不过我也看过,在地方这样说
如果你学习C++,你最终将学习大部分C语言,并且随着时间的推移会学习一些语言之间的差异.
所以我的问题只有这个:
如果我非常了解C++,我最终会学习"真正的"C语言(没有任何"差异"),因为完整的C90语言包含在C++ 11中吗?
从功能和语法上来说,原型为int foo(void)和的函数之间是否有区别int foo(void *)?
我知道,例如之间的差异,int bar(int)以及int bar(int *)-其中之一是寻找一个int,另一种是找一个int指针。void行为是否相同?
可能重复:
C void参数
刚开始用C而我找不到答案...
两者之间有什么区别吗?
int foo() { }
int foo(void) { }
Run Code Online (Sandbox Code Playgroud)
我应该选择哪个?为什么?
请注意,这个问题也适用于:int main.它应该是:int main或者int main(void)当我不想要任何命令行参数时.
看一下我的一些旧代码,我发现出于笨拙,我定义了一个像这样的析构函数:
~ResourceManager(void);
Run Code Online (Sandbox Code Playgroud)
这不仅可以编译,而且可以按预期工作.我当然改变了
~ResourceManager();
Run Code Online (Sandbox Code Playgroud)
但是我太快重构了吗?第一个版本是正确的还是好的C++风格?
由于问题已经结束,并且没有任何机会进行适当的消除歧义,因此我应该从解决这个问题的标准中提出相关的引用,当析构函数被放入透视图时
12.4析构函数
- 使用可选函数说明符(7.1.2)后跟〜后跟析构函数的类名后跟空参数列表的特殊声明符语法用于在类定义中声明析构函数.在这样的声明中,〜后跟析构函数的类名可以包含在可选的括号中; 这样的括号被忽略了.在析构函数声明的声明符中,不应将typedef-name用作〜之后的类名.
因此标准要求空参数列表.也许向后兼容自由函数的 C实践(f(void)声明空参数列表的方式)在实现中将析构函数与它们一起使用,但它肯定似乎不是有效的C++.