关于C和C++的标准,可以在Open Standards这个网站找到。
C语言标准:
点开网站首页。
找到"WG14 - C",点开页面。
找到“The current C programming language standard (C11) ISO/IEC 9899 was adopted by ISO and IEC in 2011.”,点开连接。
找到“The latest publically available version of the C11 standard is the document WG14 N1570, dated 2011-04-12. This is a WG14 working paper, but it reflects what was to become the standard at the time of issue.”,这个N1570.pdf下载下来就是C11标准文档。
同一页面,下面还可以下载C99的标准文档,“The latest publicly available version of the C99 standard is the combined C99 + TC1 + TC2 + TC3, WG14 N1256,”
同一页面,还有个C99RationaleV5.10.pdf文档,“The rationale for the C99 standard is available.”。
C++标准:
回到网站首页。
找到“* WG21 - C++”,点开页面。
找到“* ISO/IEC 14882:2017 Programming Language C++ - draft”,点开页面。
找到“A draft for the 2020 edition is available in N4849.”,这个是最新版本,
找到“A draft for the 2011 edition is available in N3242.”,这就是C++11版本。
注意:中间的版本,可以在标准下载页面,找到“papers”,点开后,选择相应年份,下载相应版本。
上面拿到的只是一些草稿版本,如果要下载正式版,要去ISO官方网站,而且是要花钱的哦。是以瑞士法郎(CHF)标价,每个198,相当贵了。
C标准最新2018:
ISO - ISO/IEC 9899:2018 - Information technology — Programming languages — C
C++标准最新2020:
ISO - ISO/IEC 14882:2020 - Programming languages — C++
关于C语言标准的一些信息,还可以参考下面的链接:
关于C++语言标准,还可以参考网站:Standard C++
-------------------------------
标准已经找到,那关于语言上的问题就可以参照标准来解决。
现在正好有个问题,关于:
int func( ) 和int func( void )有什么不同?
如果一个函数没有参数,是不写参数列表,还是写上void好呢?
我们先查一下C++11的标准:
“8 Declarators” -> "8.3.5 Functions" -> 第4点。
找到:“The parameter list (void) is equivalent to the empty parameter list.”。
那就是说,在C++里,这两种写法是没有区别的。
再查一下C11的标准:
“6. Language” -> "6.7 Declarations" -> "6.7.6.3 Function declarators (including prototypes)" -> 第10点。
10 The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.
这表明有void表示没有参数,没有void表示没有说明参数列表。
#include <stdio.h>
void func1( )
{
printf("func1.\n");
}
void func2( void )
{
printf("func2.\n");
}
int main( )
{
func1();
func2();
func1(1);
func2(2); // error: too many arguments to function ‘func2’
return 0;
}
所以,如果参数位置不写,调用时可以使用任意参数列表,如果加上void,就表示没有参数,调用时不能传递参数。
注意,以上说明的都是函数在声明和定义时的格式,如果调用函数时,没有参数就为空,不能加void。
在C/C++编译器编译时,调用某个函数时,需要在调用点之前有这个函数的原型声明,比如在本编译单元的源文件内部或包含的头文件中。
如果在调用点之前有函数的定义,也可以编译通过,相当于编译器默认生成了函数的原型声明。
对于变量,也是这样的。
我们在处理原型声明和定义的时候,应该保证其一致性。
并且,当声明和定义同时出现在调用点之前,会以声明为准。
比如:
void func(void);
void func()
{
}
int main()
{
f(1); // compile error
return 0;
}
函数声明在调用点之前,则调用函数时以函数的声明为准,而不管函数定义在什么地方。
如果函数定义在调用点之前,而函数原型声明在调用点之后,则会按照函数定义的规则来调用。
为了方便起见,在源文件中,把需要的函数原型声明都放在开头,而函数定义和声明保持一致,位置只要在声明之后即可。