C中复合类型的目的是什么?
What is the purpose of composite types in C?
人们将此 post 标记为 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()
没有原型,而另一个有原型。 without 声明的形式来自早期的 C,并被标记为已过时多年。
当将原型引入 C 以适应旧代码和新代码时,两者之间的复合类型构造有所帮助。
使用与预期参数不对应的参数调用函数具有未定义的行为,因此使用该机制你必须知道你在做什么。
简而言之,不要使用没有原型的声明。它们已经过时很久了,随时可能从 C 标准中删除。
人们将此 post 标记为 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()
没有原型,而另一个有原型。 without 声明的形式来自早期的 C,并被标记为已过时多年。
当将原型引入 C 以适应旧代码和新代码时,两者之间的复合类型构造有所帮助。
使用与预期参数不对应的参数调用函数具有未定义的行为,因此使用该机制你必须知道你在做什么。
简而言之,不要使用没有原型的声明。它们已经过时很久了,随时可能从 C 标准中删除。