相关疑难解决方法(0)

为什么没有参数的函数(与实际函数定义相比)编译?

我刚刚遇到某人的C代码,我很困惑为什么要编译.有两点我不明白.

首先,与实际函数定义相比,函数原型没有参数.其次,函数定义中的参数没有类型.

#include <stdio.h>

int func();

int func(param)
{
    return param;
}

int main()
{
    int bla = func(10);    
    printf("%d", bla);
}
Run Code Online (Sandbox Code Playgroud)

为什么这样做?我已经在几个编译器中测试过,它运行正常.

c parameters function-parameter function-prototypes

385
推荐指数
8
解决办法
5万
查看次数

c99中的func()vs func(void)

void func() 实际上,空参数表示接受任何参数.

void func(void) 不接受任何争论.

但在标准C99中,我找到了这样的界限:

6.7.5.3函数声明
(包括原型) 14标识符列表仅声明函数参数的标识符.函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数.函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息.

根据标准,func()并且func(void)是相同的?

c c99

59
推荐指数
4
解决办法
5420
查看次数

C的main()函数的有效签名是什么?

C中主要功能的有效签名究竟是什么?我知道:

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

还有其他有效的吗?

c signature entry-point language-lawyer function-prototypes

58
推荐指数
4
解决办法
4万
查看次数

int main(){}(没有"void")在ISO C中是否有效且可移植?

C标准main为托管实现指定了两种形式的定义:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

它可以以与上述"等效"的方式定义(例如,您可以更改参数名称,替换int为定义为int或写char *argv[]为的typedef名称char **argv).

它也可以"以某种其他实现定义的方式"定义 - 这意味着如果实现记录它们,那么它们int main(int argc, char *argv[], char *envp)是有效的.

"以其他一些实施方式定义的方式"条款不在1989/1990标准中; 它是由1999标准添加的(但早期标准允许扩展,因此实现仍然允许其他形式).

我的问题是:鉴于当前(2011)ISO C标准,是表格的定义

int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

所有托管实现都有效且可移植?

(请注意,我没有解决C++中的任何一个void main或没有使用 int main()括号的问题.这只是ISO int main(void)int main()ISO 之间的区别.)

c c99 language-lawyer c11

22
推荐指数
3
解决办法
1133
查看次数