考虑这两个函数定义:
void foo() { }
void foo(void) { }
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?
什么是更好的:void foo()或void foo(void)?随着虚空,它看起来丑陋和不一致,但我被告知它是好的.这是真的?
编辑:我知道一些旧的编译器做了奇怪的事情,但如果我只使用GCC,那void foo()好吗?将foo(bar);随后被接受?
希望得到" 无效 "一词来源的基础知识,以及为什么它被称为无效.这个问题的目的是帮助那些没有C经验的人,并突然看到一个基于C的代码库.
好的,所以我听到了关于这个主题的不同意见,只是想确保我理解正确.
声明void f();和void f(void);意思完全相同,功能f不带任何参数.同样的定义.
声明void f(void);意味着f不带任何参数.
声明void f();意味着函数f可能有也可能没有参数,如果有,我们不知道它们是什么类型的参数,或者它们有多少参数.请注意,它与省略号不同,我们无法使用va_list.
现在这里的事情变得有趣了.
宣言:
void f();
Run Code Online (Sandbox Code Playgroud)
定义:
void f(int a, int b, float c)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
宣言:
void f();
Run Code Online (Sandbox Code Playgroud)
定义:
void f()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
当我们f使用正确的参数,错误的参数和根本没有参数调用时,在情况1和2的编译时会发生什么?运行时会发生什么?
如果我f用参数声明,但没有它们来定义它,它会有所作为吗?我应该能够解决函数体中的参数吗?
我见过带有以下签名的方法:
void foo (void);
Run Code Online (Sandbox Code Playgroud)
他们没有争论,但我想知道这样做是否有用.你有没有理由想要这样做?
可能重复:
C void参数
刚开始用C而我找不到答案...
两者之间有什么区别吗?
int foo() { }
int foo(void) { }
Run Code Online (Sandbox Code Playgroud)
我应该选择哪个?为什么?
请注意,这个问题也适用于:int main.它应该是:int main或者int main(void)当我不想要任何命令行参数时.
BATMAN/ALFRED OpenMesh项目:
function read_answer实例化指向已定义的类型struct vis_print_ops的指针
struct vis_print_ops
{
void (*preamble)(void);
void (*interfaces)(uint8_t iface_n, struct vis_iface *ifaces);
void (*entries)(uint8_t entries_n, struct vis_entry *vis_entries,
uint8_t iface_n, struct vis_iface *ifaces);
void (*postamble)(void);
};
Run Code Online (Sandbox Code Playgroud)
现在看看
void (*preamble)(void)
Run Code Online (Sandbox Code Playgroud)
你能告诉我最后一个(无效)是什么意思吗?是不是
void (*preamble)
Run Code Online (Sandbox Code Playgroud)
足够?