ANSI C标准化过程的目标之一是生成K&R C(第一个发布的标准)的超集,其中包含随后引入的许多非官方特征.但是,标准委员会还包括一些新功能,例如函数原型(借用C++编程语言)和更强大的预处理器.参数声明的语法也已更改,以反映C++样式.
这让我觉得有差异.但是,我没有看到K&R C和ANSI C之间的比较.是否有这样的文件?如果没有,主要区别是什么?
编辑:我相信K&R书的封面上写着"ANSI C".至少我相信我在家里的版本确实如此.那么也许没有什么区别了?
我最近在玩GNU Bison的时候看过这样的一些函数定义:
static VALUE
ripper_pos(self)
VALUE self;
{
//code here
}
Run Code Online (Sandbox Code Playgroud)
为什么self括号外的类型?这是有效的C吗?
在C++ 11中,以下函数声明:
int f(void);
Run Code Online (Sandbox Code Playgroud)
意思是:
int f();
Run Code Online (Sandbox Code Playgroud)
由非依赖类型void的单个未命名参数组成的参数列表等效于空参数列表.
我得到(也许是错误的)印象这是一个旧功能,也许是从C继承而来的?
有没有人知道这种方式背后的历史或理由来声明一个没有参数的函数?
可能重复:
C函数语法,参数列表后声明的参数类型
我在" 专家C编程 "中看到了以下函数定义语法
int compare(s1, s2)
char * s1, *s2;
{
while (*s1++ == *s2) {
if (*s2++ == 0) return (0);
}
return (*--s1 - *s2);
}
Run Code Online (Sandbox Code Playgroud)
上述定义如何有效?它编译和运行完美,没有任何错误.
对于函数定义,我更熟悉以下语法
int compare(char * s1,char *s2)
{
while (*s1++ == *s2) {
if (*s2++ == 0) return (0);
}
return (*--s1 - *s2);
}
Run Code Online (Sandbox Code Playgroud)
并且我没有看到书中给出的那个(在我大学或其他地方学习C时),任何人都可以对书中给出的那些进行一些说明.
从K&R Book on C,我收集到如果函数原型声明省略了参数(如int foo();),关闭类型和参数检查,并且没有假设参数与旧版本的C兼容,因此它不会打破遗留代码.
但是下面的代码抛出了原型不匹配的编译错误:
#include <stdio.h>
void test();
int main(void) {
test(34.5f);
}
void test(float a) {
printf("%f\n", a);
}
Run Code Online (Sandbox Code Playgroud)
错误:
C:\***.c:7:6: error: conflicting types for 'test'
void test(float a) {
^
Run Code Online (Sandbox Code Playgroud)
有什么解释吗?
可能重复:
定义中的函数标题之后的C变量声明
这个C语法有用吗?
我试图理解一些C代码并遇到了这个函数的头部和第一个支撑之间声明变量的地方.
知道这些变量是什么吗?
他们是本地的还是全球的?
作者打算在这做什么?
void someFunction (m_ptr, n_ptr, params, err)
integer *m_ptr; /* pointer to number of points to fit */
integer *n_ptr; /* pointer to number of parameters */
doublereal *params; /* vector of parameters */
doublereal *err; /* vector of error from data */
{
//some variables declared here
int i;
...
...
//body of the function here
}
Run Code Online (Sandbox Code Playgroud) 这是代码:
A_output(message)
struct msg message;
{
}
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这样的语法。该结构定义在做什么?这只是在参数字段中指定“消息”的“类型”的另一种方式吗?那么,它是一样的吗?:
A_output(struct msg message)
{
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解一些代码,它具有以下内容:
int getr(fget)
FILE *fget;
{
/* More declarations and statements here */
return (1);
}
Run Code Online (Sandbox Code Playgroud)
以上和之间有什么区别:
int getr(fget)
{
FILE *fget;
/* More declarations and statements here */
return (1);
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,他们有什么不同?
c ×10
function ×4
kr-c ×2
c++ ×1
c++11 ×1
c89 ×1
curly-braces ×1
definition ×1
struct ×1
syntax ×1