为什么没有人用高级功能升级他们的C编译器?

Man*_*bts -1 c c++ compiler-construction visual-studio

struct elem
{
 int i;
 char k;
};
elem user; // compile error!
struct elem user; // this is correct
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们收到第一个声明的错误.但是C++编译器不会发生此错误.在C++中,我们不需要一次又一次地使用关键字struct.

那么为什么没有人更新他们的C编译器,以便我们可以在C++中使用没有关键字的结构?

为什么C编译器开发人员不会删除C的一些故障,如上所述,并更新一些高级功能而不破坏C的原始概念?

为什么它是从1970年代更新的旧编译器?

看看视觉工作室等.它经常更新新版本,每个新版本我们都要学习一些新的功能用法(尽管这是一个我们可以解决它的问题).如果有的话,我们也会更新新的编译器.

不要把这当作一个愚蠢的问题.为什么不可能?它可以在没有任何不兼容问题的情况下开发(不影响在当前/旧编译器上开发的代码)

好的,我们开发新的C语言C +,它介于C和C++之间,它消除了C的所有故障,并添加了C++的一些高级功能,同时保持它对系统级应用程序,嵌入式系统等特定应用程序有用.

Mic*_*tum 16

因为新标准的发展需要数年时间.他们正在研究新的C++标准(C++ 0x),以及新的C标准(C1x),但如果你记得每次迭代通常需要5到10年,我不希望看到它在2010年之前左右.

而且,就像在任何民主国家一样,标准中存在妥协.你有强硬派的人说:"如果你想要所有那些花哨的语法糖,那就去购买Java或C#这样的玩具语言,它会带你去买一个棒棒糖",而其他人则说"语言需要更容易,在这些日子里不易出错或者迅速减少开发周期".

双方都是部分正确的,因此标准化是一场漫长的战斗,需要数年时间,并将导致许多妥协.这适用于涉及多个大型聚会的所有事物,它不仅限于C/C++.


Mir*_*cek 15

typedef struct
{
 int i;
 char k;
} elem;

elem user;
Run Code Online (Sandbox Code Playgroud)

会很好地工作.正如其他人所说的那样,它是关于标准的 - 当你在VS2008中实现它时,你不能在GCC中使用它,甚至在GCC中实现它时,你肯定不会编译其他东西.以上方法随处可见.

另一方面 - 当我们有boo类型的C99标准时,for()循环和块中间的声明 - 为什么不是这个特性呢?


Mic*_*man 10

首先,编译器需要支持该标准.即使标准在后见之明看起来很尴尬,这也是事实.其次,编译器供应商会添加扩展.例如,许多编译器支持这一点:

(char *) p += 100;
Run Code Online (Sandbox Code Playgroud)

将指针移动100个字节而不是100 p指针的任何类型.严格来说,这是非标准的,因为演员删除了左值p.

非标准扩展的问题在于您不能指望它们.如果您想要切换编译器,使代码可移植或使用第三方工具,那么这是一个大问题.

C在很大程度上是自身成功的牺牲品.使用C的主要原因之一是可移植性.几乎所有硬件平台和操作系统都有C编译器.如果您希望能够在C中编写代码的任何地方运行代码.这会产生巨大的惯性.在不牺牲首先使用该语言的最佳方法之一的情况下,几乎不可能改变任何东西.

软件开发人员的结果是您可能需要写入最小的公分母,通常是ANSI C(C89).例如:运行下一版本Perl的虚拟机Parrot正在用ANSI C编写.Perl6将具有非常强大和富有表现力的语法,并且在语言中融入了一些令人费解的概念.但是,实现是使用几乎完全相反的语言构建的.原因是这将使perl可以在任何地方运行:PC,Mac,Windows,Linux,Unix,VAX,BSD ......


Chr*_*ung 7

未来的C标准永远不会采用这种"特性" ,原因只有一个:它会严重破坏向后兼容性.在C中,struct标签具有与普通标识符不同的名称空间,这可能会也可能不会被视为特征.因此,这个片段:

struct elem
{
    int foo;
};

int elem;
Run Code Online (Sandbox Code Playgroud)

在C中完全没问题,因为这两个元素位于不同的名称空间中.如果未来的标准允许您声明没有struct限定符或适当的typedef的struct elem,则上述程序将失败,因为elem被用作int的标识符.

事实上,未来的C标准确实打破向后兼容性的一个例子是当C99不允许没有显式返回类型的函数时,即:

foo(void); /* declare a function foo that takes no parameters and returns an int */
Run Code Online (Sandbox Code Playgroud)

这在C99中是非法的.但是,仅仅通过添加int返回类型来使这个C99兼容是微不足道的.如果突然的struct标签没有单独的命名空间,那么"修复"C程序并不是那么简单.


Wal*_*ght 7

我发现当我实现C和C++的非标准扩展时,即使人们请求它们,它们也不会被使用.C和C++世界绝对围绕严格的标准合规性.许多这些扩展和改进已经在D编程语言中找到了肥沃的土壤.

Walter Bright,数字火星


Joe*_*orn 6

仍然使用C的大多数人使用它是因为他们要么:

  • 针对非常特定的平台(即嵌入式),因此必须使用该平台供应商提供的编译器
  • 关注可移植性,在这种情况下,非标准编译器会破坏目的
  • 对普通C非常舒服并且没有理由改变,在这种情况下他们只是不想.