c - C中复合类型的目的是什么?

标签 c types c99 c11 c89

<分区>

人们已将此帖子标记为与 this 的重复但这实际上并不是因为我不是在问什么是复合类型,而是它的目的是什么,我给出了一个可能对软件开发人员造成伤害的用例,然后问这是否应该是未定义的行为。

我正在阅读 C11 标准中关于复合类型的部分,我当时想:到底为什么有人会做那样的事情?

我的意思是我看不出有什么有趣的地方。我认为这对程序员来说是非常困惑的。举个例子,假设我们有一个函数 void f(),人们在软件中随处使用,他们只需声明 extern void f() 并使用它。函数的定义是程序员不关心的地方;然后有一天,一个聪明人需要向该函数添加一个参数并将定义更改为类似 void f(int *ptr) {/* ..*/return *ptr;} 的内容。该软件仍然可以顺利编译,但是天哪,所有使用旧界面的遗留代码都被段错误搞砸了。

下面的代码是一个演示:

/* main.c */
#include <stdio.h>

int f (); 
int p = 5;

int main () 
{
    int r = f ();   /* This call will cause segfault */
    int s = f (&p);

    printf ("r=%d / s=%d \n", r, s);

    return 0;
}


/* another_unit.c */

int f (int *ptr) 
{
    return *ptr;
}

我不明白这样的事情的目的。在我看来,这应该是未定义的行为,或者至少为什么像 GCC 这样的编译器对此什么都不说?

最佳答案

你的例子中的要点是函数 f() 没有原型(prototype),而另一个有原型(prototype)。 without 声明的形式来自早期的 C,并被标记为已过时多年。

当将原型(prototype)引入 C 以适应旧代码和新代码时,两者之间的复合类型构造很有帮助。

使用与预期参数不对应的参数调用函数具有未定义的行为,因此使用该机制必须知道您在做什么。

简而言之,不要使用没有原型(prototype)的声明。它们早就过时了,随时可能从 C 标准中删除。

关于c - C中复合类型的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51913610/

相关文章:

c - 程序化 SLI 和 CrossFireX 检测

haskell - Haskell相互递归的澄清

arrays - c 函数是否可以同时接受 double 和 long double 参数?

c++ - 在 C/C++ 中求和 bool 值

c - 如何将无穷大值传递给函数并测试结果

C 程序和宏

在预购中将 BST 转换为 DLL(基本)

c - 对于任何类型,使用 const void* 代替 void*

无法获得混合的 C 和 Ada 程序以与 pthread 库链接

types - 如何在 TradingView pinescript 中实现条件长度移动平均线?