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

标签 c ansi-c

我是 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/

相关文章:

c++ - 在另一个文件中使用 lex 生成的源代码

c - 为什么在初始化多维数组时不能完全省略维度?

c - ANSI-C pow 函数和类型转换

c - 使用 ANSI C 中的正则表达式扫描和交换字符串值

c - OpenWRT 与 NetBeans 7.3.1

c - c中的冒泡排序程序

c - 使用 freopen 及其后的 fopen 是否合法?

c - 有什么方法可以通过宏生成参数依赖于编译时信息的函数吗?

C++ 标准,有点困惑吗?