代码之家  ›  专栏  ›  技术社区  ›  Karim Manaouil

C中复合类型的用途是什么?[关闭]

  •  -1
  • Karim Manaouil  · 技术社区  · 7 年前

    人们把这篇文章标记为 this 但这并不是因为我没有问什么是复合类型,而是它的目的是什么,我给出了一个用例,它可能会对软件开发人员造成伤害,然后问这是否应该是未定义的行为。

    我是说我看不出有什么有趣的。我认为这对程序员来说非常混乱。为了举例,假设我们有一个函数 void f() 人们在软件中到处使用,他们只是声明 extern void f() 使用它。函数的定义是程序员不关心的;然后有一天,一个聪明的家伙需要给函数添加一个参数,并将定义改为 void f(int *ptr) {/* ..*/ return *ptr;} . 这个软件仍然可以很好地编译,但是上帝,所有使用旧接口的遗留代码都被segfults搞砸了。

    下面的代码是一个演示:

    /* 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;
    }
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jens Gustedt    7 年前

    示例中的要点是 f() 没有原型,另一个有一个。“不带”的申报形式来自早期的C语言,多年来被标记为过时。

    当原型被引入到C中以适应旧代码和新代码时,两者之间的复合类型的构造起到了帮助作用。

    调用一个函数时,其参数与它所期望的参数不对应,因此该机制具有未定义的行为 必须知道你在做什么。

    简而言之,不要使用没有原型的声明。它们已经过时很久了,随时可能从C标准中删除。