【发布时间】:2011-04-24 09:58:29
【问题描述】:
对于像 C++ 这样的语言,标准的存在是必须的。优秀的编译器会尽最大努力(至少是大多数优秀的编译器)来遵守。许多编译器都有语言扩展,有些是标准允许的,有些是不允许的。后一类的2个例子:
gcc 的类型
-
microsoft 的编译器允许纯虚函数声明同时具有纯说明符 (=0) 和定义(这是标准所禁止的 - 我们不讨论原因,这是另一个话题:)
(还有很多其他的例子)
这两个示例在以下方面都很有用:example1 是一个非常有用的功能,将在 c++0x 中以不同的名称提供。 example2 也很有用,微软决定不遵守没有意义的禁令。
我很感激编译器提供的语言扩展可以帮助我们的开发人员完成日常工作。但这里有一个问题:不应该有一个选项,当设置时,它要求编译器尽可能地符合标准,无论他们是否同意标准。例如 Visual Studio 就有这样一个选项,称为禁用语言扩展。但是,嘿,他们仍然允许 example2。
我希望每个人都能正确理解我的问题。 MSVC 允许 example2 是一件很棒的事情,我非常希望该功能成为标准。它不会破坏任何合规的代码,它不会做任何坏事。它只是不标准。
当禁用语言扩展设置为 true 时,您是否希望 microsoft 禁用 example2?请注意,microsoft、example2 等这些词是占位符 :) 为什么?
再次,只是为了确保。关键点是:当编译器提供了一个非标准的更好的替代方案并且是甚至可能是标准的超集,因此不会破坏任何东西。
【问题讨论】:
-
example2 在 g++ 中也是允许的,不仅是 MSVC。
-
我很确定标准允许定义纯虚拟。 en.wikipedia.org/wiki/Virtual_function “虽然纯虚方法通常在声明它们的类中没有实现,但 C++ 中的纯虚方法允许在其声明类中包含实现,提供派生类可以在适当时委托给的后备或默认行为。 ",但你的问题仍然很有趣。
-
说“它没有坏处”非常简单。如果您默认允许不合规代码,那么人们倾向于使用它,然后最终编写的合规代码很少。诚然,它不会影响那些决心编写 100% 合规代码的人,但它确实意味着任何不太了解合规意味着什么的人最终都会编写不合规的代码,甚至没有意识到它。然后在 5 年后,当他们的编译器更新为更严格,或者当他们必须将他们的软件移植到另一个平台时,他们将面临很多痛苦。
-
@Lou,是的,定义是允许的,但作为一个单独的声明,不在你写 =0 的同一个声明中。离顶:)
-
该主题有 2 票未投票。你能告诉我这个话题有什么可怕的地方值得结束吗?不要这么牛逼:)))