【问题标题】:What is the purpose of composite types in C? [closed]C中复合类型的目的是什么? [关闭]
【发布时间】:2019-01-25 13:43:39
【问题描述】:

人们已将此帖子标记为 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 这样的编译器不说什么?

【问题讨论】:

  • @DavidMaze 这根本不是同一个问题。我愿意了解有关复合类型的其他信息,而不是它们是什么。我有一个完全不同的目标。请在评论之前阅读我的帖子。除此之外,您提供的链接在答案中没有足够的信息。它甚至不回答原始帖子,当然也不是我的。
  • 重复问题的答案之一解释了为什么需要复合类型:为了讨论 completeincomplete 类型之间的关系。您的问题似乎更多地集中在旧式函数声明上,这是 C 的一个过时特性(这意味着它将被弃用并最终从语言中删除)。如果你问得好,编译器会警告此类声明。
  • 仅仅因为该特性允许程序员自己动手,并不足以成为未定义行为的充分理由。 C 不是手持语言;程序员有责任确保代码行为正常。

标签: c types c99 c11 c89


【解决方案1】:

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

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

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

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

【讨论】:

  • 现在,它更有意义了,因为复合类型与 C 的历史相关,并且需要它们来适应旧代码和新代码。我的意思是人们不是因为觉得它很酷才这样提出来的。
猜你喜欢
  • 2013-05-01
  • 2011-03-31
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多