我正在尝试使用一些旧的C89代码,但无法对其进行构建。我通常的环境是Visual Studio,但是似乎只支持C99,并且某些C99功能(例如stdio等不一定是恒定的)破坏了代码- lot 。在我开始篡改代码之前,我想编写一些测试,所以我不会破坏旧的行为,但是可以说,我无法测试这些测试,然后才能构建代码。
那么还有什么方法可以在Windows上编译C89代码?
编辑:史蒂夫·萨米特(Steve Summit)已经确定
答案 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()
FILE* ifp = NULL;
int main()
{
ifp = stdout;
fprintf(ifp, "test\n");
return 0;
}