Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中复合类型的用途是什么?_C_Types_C99_C11_C89 - Fatal编程技术网

C中复合类型的用途是什么?

C中复合类型的用途是什么?,c,types,c99,c11,c89,C,Types,C99,C11,C89,人们将这篇文章标记为的副本,但实际上并不是因为我不是问什么是复合类型,而是问它的用途,我给出了一个可能对软件开发人员造成伤害的用例,然后问这是否应该是未定义的行为。 我在读C11标准中关于复合类型的那部分,我就想:究竟为什么有人会这样做 我是说我看不出有什么有趣的。我认为这对程序员来说是非常混乱的。举个例子,假设我们有一个函数void f(),人们在软件中到处使用它,他们只是声明extern void f()并使用它。函数的定义是程序员不关心的;然后有一天,一个聪明人需要给这个函数添加一个参数,

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

我在读C11标准中关于复合类型的那部分,我就想:究竟为什么有人会这样做

我是说我看不出有什么有趣的。我认为这对程序员来说是非常混乱的。举个例子,假设我们有一个函数
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;
}
/*main.c*/
#包括
intf();
int p=5;
int main()
{
int r=f();/*此调用将导致segfault*/
int s=f&p;
printf(“r=%d/s=%d\n”,r,s);
返回0;
}
/*另一个单位c*/
int f(int*ptr)
{
返回*ptr;
}

我看不出这样做的目的。在我看来,这应该是未定义的行为,或者至少是为什么像GCC这样的编译器不对此做任何说明

示例中的要点是函数
f()
没有原型,而另一个函数有原型。无条件声明的形式起源于C早期,多年来被标记为过时

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

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


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

您示例中的要点是函数
f()
没有原型,而另一个有原型。无条件声明的形式起源于C早期,多年来被标记为过时

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

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


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

查看这个问题@DavidMaze的可能副本这根本不是同一个问题。我愿意了解关于复合类型的其他知识&而不是它们是什么。我有一个完全不同的目标。请在评论之前阅读我的帖子。除此之外,你给出的链接在答案中没有足够的信息。它甚至没有回答原来的帖子,当然也没有回答我的帖子。重复问题的一个答案解释了为什么需要复合类型:为了讨论完整类型和不完整类型之间的关系。您的问题似乎更多地集中在旧式函数声明上,这是C语言的一个过时特性(这意味着它将被弃用并最终从语言中删除)。如果你问得好的话,编译器确实会对这样的声明发出警告。仅仅因为这个特性允许程序员自己动手,还不足以让它成为未定义的行为。C不是一种手持语言;程序员负责确保代码以一种正常的方式运行。检查这个问题,可能重复@DavidMaze,这根本不是同一个问题。我愿意了解关于复合类型的其他知识&而不是它们是什么。我有一个完全不同的目标。请在评论之前阅读我的帖子。除此之外,你给出的链接在答案中没有足够的信息。它甚至没有回答原来的帖子,当然也没有回答我的帖子。重复问题的一个答案解释了为什么需要复合类型:为了讨论完整类型和不完整类型之间的关系。您的问题似乎更多地集中在旧式函数声明上,这是C语言的一个过时特性(这意味着它将被弃用并最终从语言中删除)。如果你问得好的话,编译器确实会对这样的声明发出警告。仅仅因为这个特性允许程序员自己动手,还不足以让它成为未定义的行为。C不是一种手持语言;程序员负责确保代码以一种正常的方式运行。现在,它更有意义了,因为复合类型与C的历史有关,它们需要在旧代码和新代码之间进行调整。我的意思是,人们不是因为觉得它很酷才提出这样的东西。现在,它更有意义了,因为复合类型与C的历史有关,它们需要适应新旧代码。我的意思是,人们不是因为觉得这很酷才提起这件事的。