Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将具有固定数组大小的ANSI C之前的函数声明转换为ANSI_C_Ansi - Fatal编程技术网

将具有固定数组大小的ANSI C之前的函数声明转换为ANSI

将具有固定数组大小的ANSI C之前的函数声明转换为ANSI,c,ansi,C,Ansi,我是C语言的新手(至少在C语言中是生锈的),我正在VisualStudio2010中编写一些ANSI之前的C代码。它编译得很好,但Intellisense对函数声明非常着迷: int add() int a, int b; { return a + b; } 而不是ANSI int add(int a, int b) { return a + b; } 但是我遇到了一些函数声明中带有边界的数组实例,我认为这不能直接转换为ANSIC int add() in

我是C语言的新手(至少在C语言中是生锈的),我正在VisualStudio2010中编写一些ANSI之前的C代码。它编译得很好,但Intellisense对函数声明非常着迷:

int add()
    int a, int b;
{
    return a + b;
}
而不是ANSI

int add(int a, int b) 
{
    return a + b;
}
但是我遇到了一些函数声明中带有边界的数组实例,我认为这不能直接转换为ANSIC

int add() 
    int a[5], int b[5];
{
    ...
}
下面的代码编译得很干净,但这是否意味着完全相同的事情

int add(int a[5], int b[5]) {
}

是的,它的意思是一样的,但它并没有(也从来没有)真正意味着它看起来应该意味着什么

这些参数实际上是指针。根据推断,它们指向的数组中应该有5个元素,但这并不能保证。特别是,鉴于:

extern int add(int a[5], int b[5]);

int x[4];
int y[6];

add(x, y);
这不会导致编译器抛出警告

使用C99,您可以让优化器假设至少有5个条目使用(奇怪的)符号:

int add(int a[static 5], int b[static 5]) { ... }

即使这样,也不一定会在呼叫站点发出警告;它是编译器的信息(尽管它是否使用它取决于编译器)。

是的,它的意思是相同的,但它并不(也从来没有)真正意味着它看起来应该意味着什么

这些参数实际上是指针。根据推断,它们指向的数组中应该有5个元素,但这并不能保证。特别是,鉴于:

extern int add(int a[5], int b[5]);

int x[4];
int y[6];

add(x, y);
这不会导致编译器抛出警告

使用C99,您可以让优化器假设至少有5个条目使用(奇怪的)符号:

int add(int a[static 5], int b[static 5]) { ... }

即使这样,也不一定会在呼叫站点发出警告;它是编译器的信息(尽管是否使用它取决于编译器)。

如果编译器知道该参数提供了对小于5个元素的数组的访问,那么它可能会在调用站点发出警告。但是它不能保证这样做(行为是未定义的)。(gcc没有发出警告。)那么用无界数组翻译有问题的语句会更准确吗
intadd(inta[],intb[]){…}
。程序应该关心阵列有多大;除非它知道有多少空间可供使用,否则它不会安全。语法问题是,原型或参数列表中指定的边界实际上并不密切相关(对于1D数组或向量,它们对于
add_2d(int n,int a[][10],int b[]10])
添加
n
a
b
,这两个数组都是
int a[20][10];
)至关重要,如果编译器知道该参数提供对小于5个元素的数组的访问,则可能会在调用站点发出警告。但是它不能保证这样做(行为是未定义的)。(gcc没有发出警告。)那么用无界数组翻译有问题的语句会更准确吗
intadd(inta[],intb[]){…}
。程序应该关心阵列有多大;除非它知道有多少空间可供使用,否则它不会安全。语法问题是,原型或参数列表中指定的边界实际上并不密切相关(对于1D数组或向量,它们对于
add_2d(int n,int a[][10],int b[]10])
添加
n
a
b
,这两个数组都是
int a[20][10];
)。