是否可以在MS Windows上编译C89代码?

时间:2019-05-22 14:11:08

标签: c windows c89

我正在尝试使用一些旧的C89代码,但无法对其进行构建。我通常的环境是Visual Studio,但是似乎只支持C99,并且某些C99功能(例如stdio等不一定是恒定的)破坏了代码- lot 。在我开始篡改代码之前,我想编写一些测试,所以我不会破坏旧的行为,但是可以说,我无法测试这些测试,然后才能构建代码。

那么还有什么方法可以在Windows上编译C89代码?

编辑:史蒂夫·萨米特(Steve Summit)已经确定从不保证了stdio等;它只是一些编译器的一个功能,而我的旧代码恰好以深层嵌入的方式依赖于此。因此,我的问题转向是否有可用于该假设的Windows可用的Windows C编译器(最好是免费的!)。另外,尽管我经验很少,但我在虚拟机中安装了Ubuntu-在Ubuntu中有这样的编译器吗?

3 个答案:

答案 0 :(得分:2)

[这不是真正的答案,但是太过复杂,无法发表评论。]

如果您有执行类似操作的代码

#include <stdio.h>
FILE *ifp = stdin;
int main() { ... }

并且如果您遇到的问题是错误指出stdin不是适合静态初始化程序的编译时常量,那么我认为您将不得不重写代码的这一方面。我可能是错的,但是如果我没记错的话,stdin等人的想法。编译时常量绝不能保证,只是最早的Unix实现的有用属性。并非所有旧的实现都正确,因此对标准的“更改”明确表示它们不一定是常数,并不是本身的更改,而是或多或少编纂现有做法的分歧。

(换句话说,如果您有一个拒绝代码的编译器,即使它具有向后兼容模式,如果向后兼容模式将stdin转换为编译时常量。)

答案 1 :(得分:1)

所有受支持(甚至更旧)的Visual Studio版本都完全能够编译C89代码。另外,C99与该语言的先前版本向后兼容,因此C99编译器应该能够编译出很好的C89代码。

尽管您可能会收到一些警告,但如果该代码是可移植的,则该代码应该可以编译并正常工作。

答案 2 :(得分:-1)

MSVC是C ++编译器,最近才获得C99支持。以前,它仅支持带有某些MS扩展名的C89。要在严格的C89模式下进行编译,请使用/Za选项。确保还启用/Tc以使用C模式

  

/Za, /Ze (Disable Language Extensions)

     

/Za编译器选项会禁用Microsoft扩展C,并与ANSI C89 / ISO C90不兼容,并发出错误。已弃用的/Ze编译器选项启用Microsoft扩展。默认情况下,Microsoft扩展是启用的。

请参见Enforce ANSI C Standard in Visual Studio 2015

大多数其他编译器使用其他选项,例如-ansi, -std=c90 or -std=iso9899:1990


但是,如果在静态初始化程序列表中使用stdin / stdout时,它不是恒定的,则它与C89完全无关,实际上是XY problem。以下代码段在VS2019 C ++模式下编译没有问题,因此,如果没有任何可能的冲突,只需在C ++模式下编译代码

#include <stdio.h>
FILE* ifp = stdout;
int main()
{
    fprintf(ifp, "test\n");
    return 0;
}

否则,通过将初始化移至main()

可以很容易地将其修复为C模式。
FILE* ifp = NULL;
int main()
{
    ifp = stdout;
    fprintf(ifp, "test\n");
    return 0;
}