【问题标题】:Telling gcc to fail to compile when in pre-C99 mode在 C99 之前的模式下告诉 gcc 无法编译
【发布时间】:2019-01-24 06:34:27
【问题描述】:

我正在做一个关于 C 历史的讲座,并想展示一些过去不可能但现在已经不可能的习语(特别是在块的中间定义变量)。我想表明旧的 C 编译器不会编译它。

gcc 具有用于设置语言标准的-std= 选项。不幸的是,将其设置为 -std=c89 不会在块中间定义变量时产生编译错误。

我希望有一个更准确的标准版本(即 - -std=knr),但我找不到任何这样的选项。

我错过了什么吗?这是 GCC 中的错误吗?

gcc (Ubuntu 8.2.0-7ubuntu1) 8.2.0

错误编译的代码:

#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
        printf("Hello, world\n");

        int a;

        return 0;
}

【问题讨论】:

  • 谢谢。这不是答案有什么原因吗?
  • 您为什么要使用像 Ubuntu 8 这样的现代系统?你不应该使用旧的吗?
  • @JonathanLeffler 如果可行,则不会。我不是想效仿过去的日子(并不是说有很多方法可以做到),只是展示事情的样子。

标签: c gcc


【解决方案1】:

如果您想真正严格遵守-std 标志,则应伴随-pedantic-errors 标志。

作为演示,您在 wandbox 上带有这些标志的代码会产生:

prog.c: In function 'main':
prog.c:9:9: error: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
         int a;
         ^~~

【讨论】:

  • 尽管如诊断文本所示,GCC 知道您正在尝试做什么。它可能不像真正早于 C99 的编译器所产生的那样真实。
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 2011-01-17
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2013-05-28
相关资源
最近更新 更多