2

我是 C 新手(好吧,至少在 C 中是 RUSTY),我正在 Visual Studio 2010 中处理一些 pre-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]) {
}
4

1 回答 1

4

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

参数实际上是指针。通过推断,它们指向的数组中应该有 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]) { ... }

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

于 2013-09-26T20:05:19.433 回答