我已经习惯了旧式 C,并且最近才开始探索 c99 功能。我只有一个问题:如果我在程序中使用 c99,c99 标志与 gcc 并将其与以前的 c99 库链接?

那么,我应该坚持旧的 C89 还是进化?

有帮助吗?

解决方案

我相信他们是在这方面兼容。也就是说,只要您对编译任何关于新的好东西不踩的东西。举例来说,如果旧代码包含enum bool { false, true };那么你就有麻烦了。作为类似的恐龙,我慢慢地拥抱C99的美好新世界。毕竟,只被在那里现在潜伏约10年)

其他提示

您应该演变。谢谢观看: - )

其实,我会扩大这一点。

您说得对,C99已经存在了相当长一段时间。您的 的(在我看来)应使用比传统的代码(在那里你只是修复bug,而不是增加新的功能),其他任何标准。这也可能是不值得的遗留代码,但你应该(与所有业务决策)做自己的成本/效益分析。

我已经确保我的新代码与C1X兼容 - 虽然我不使用任何新功能呢,我试着以确保它不会打破

至于看出来什么码,标准的作者采取向后兼容的非常的重视。他们的工作是不是曾经设计出一种新的语言,这是编纂现行做法。

目前他们所在的阶段允许他们多一些宽容度在更新的语言,但他们仍然按照自己的输出方面的希波克拉底誓言:“首先,不伤害”

一般情况下,如果你的代码与新标准打破,编译器被强制告诉你。所以,简单地编译代码基地将是一个良好的开端。但是,如果你读了 C99理由文件 ,你会看到那句“安静的改变”的出现 - 这是你需要注意什么

这些都是在你不需要对被告知,可能是很多焦虑和咬牙切齿的来源,如果你的应用程序开始代理奇怪的编译器的行为变化。不要担心位“在C89安静的变化。” - 如果他们是一个problerm,你就已经被他们咬伤

这是文件,顺便说一下,是一个很好的阅读理解,为什么实际的标准说,它说什么。

尊敬:的尝试找出 :-)

不过,请记住,即使你需要修复一些minior编译区别,连升可能是值得的。

如果您不违反明确的C99功能,一个C90的代码将正常工作C99标志另一种现有C99库。

但也有一些在DOS C89基于图书馆一样,,这将肯定是不行的。

C99是灵活得多,从而随时迁移: - )

C库之间的调用约定的年龄并没有改变,而事实上,我不知道它曾经拥有。

在这一点上的操作系统在很大程度上依赖于C调用约定由于C的API往往是OS的片之间的粘合剂。

所以,基本上回答“是的,二进制代码将是向后兼容的。不,当然,使用C99功能代码以后就不能与非C99编译器编译的。”

它旨在是向后兼容。它形式化,许多厂商已经实现扩展。这是可能的,甚至有可能,与C99编译时,一个写得很好的程序将不会有任何问题。

在我的经验,重新编译某些模块,而不是别人为了节省时间......浪费了大量的时间。通常有一些容易被忽略的细节,需要新的编译器,使这一切兼容。

有这些含糊写入的C89标准的几部分,并且取决于如何一个解释关于类型的指针并且它们正在访问的对象的规则,标准可被视为描述两个非常不同的语言中的一种其中--one是语义上更强大和在更宽范围的领域因而可用,并且其中的一个允许基于编译器的优化更多的机会。 C99标准“明确”的规则明确指出,它没有努力,强制与前语言的兼容性,即使它在许多领域压倒性的青睐;它也把作为未定义一些事情在C89中定义的但只是因为没有写入的C89规则足够精确地禁止他们(例如使用memcpy的用于在箱子型双关其中目的地具有堆持续时间)。

从而

C99可以是与它的作者认为是由C89中描述的语言兼容,但不与通过最C89编译整个1990年代处理的语言兼容。

某些 C89 功能对 C99 无效

可以说,这些功能的存在只是出于历史原因,不应该在现代 C89 代码中使用,但它们确实存在。

C99 N1256标准草案 前言第 5 段将 C99 与旧版本进行了比较,并且是开始寻找这些不兼容性的好地方,尽管它的扩展远远多于限制。

隐式 int 返回和变量类型

Lutz 在评论中提到,例如以下是有效的 C89:

static i;
f() { return 1; }

但 C99 不行,你必须这样写:

static int i;
int f() { return 1; }

这也排除了在 C99 中调用没有原型的函数: C89、C90 或 C99 中的所有函数都需要原型吗?

n1256 说:

删除隐式 int

非 void 函数不带表达式返回

有效 C89,无效 C99:

int f() { return; }

我认为在 C89 中它返回一个实现定义的值。n1256 说:

返回值的函数中不允许不带表达式的返回

带负操作数的整数除法

  • C89:舍入到实现定义的方向
  • C99:四舍五入到 0

所以如果你的编译器四舍五入为 -inf, ,并且您依赖于该实现定义的行为,您的编译器现在被迫在 C99 上破坏您的代码。

https://stackoverflow.com/a/3604984/895245

n1256 说:

可靠的整数除法

Windows 兼容性

一个主要的实际问题是能够在 Windows 中编译,因为 Microsoft 不打算过早全面实施 C99.

这就是为什么 libgit2 限制允许的 C99 功能.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top