将具有固定数组大小的ANSI C之前的函数声明转换为ANSI
我是C语言的新手(至少在C语言中是生锈的),我正在VisualStudio2010中编写一些ANSI之前的C代码。它编译得很好,但Intellisense对函数声明非常着迷:将具有固定数组大小的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
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];
)。