我是 C 新手(至少在 C 中是 RUSTY),我正在 Visual Studio 2010 中处理一些 ANSI 之前的 C 代码。它编译得很好,但 Intellisense 对函数声明感到疯狂:
int add()
int a, int b;
{
return a + b;
}
代替 ANSI
int add(int a, int b)
{
return a + b;
}
但是我遇到了一些在函数声明中带有边界的数组实例,并且我不认为它们可以直接转换为 ANSI C。
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]) { ... }
即使这样也不一定会在调用站点引起警告;它是编译器的信息(尽管是否使用它取决于编译器)。
关于将具有固定数组大小的 ANSI 之前的 C 函数声明转换为 ANSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19037589/