Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cygwin:Windows上的Linux?如何确保在Windows中创建的程序适用于Linux_C_Linux_Windows_Cygwin - Fatal编程技术网

Cygwin:Windows上的Linux?如何确保在Windows中创建的程序适用于Linux

Cygwin:Windows上的Linux?如何确保在Windows中创建的程序适用于Linux,c,linux,windows,cygwin,C,Linux,Windows,Cygwin,我们有一个学校项目,它需要我们的C程序在Linux上工作,并且是c99兼容的。因为我在Windows 10上工作,所以我安装了Cygwin,并假设如果它将在Cygwin中编译,那么它肯定会在Linux中工作。它在windows上运行良好,我尝试在cygwin中编译它,它也可以运行。那么,我可以保证它在Linux中工作并且与C99兼容吗?若否,原因为何?如果是香草C99,我只使用stdio和stdlib,如果在Cygwin上运行,则使用率为99.9%,在任何Linux上都可以运行。我从来没有见过一

我们有一个学校项目,它需要我们的C程序在Linux上工作,并且是c99兼容的。因为我在Windows 10上工作,所以我安装了Cygwin,并假设如果它将在Cygwin中编译,那么它肯定会在Linux中工作。它在windows上运行良好,我尝试在cygwin中编译它,它也可以运行。那么,我可以保证它在Linux中工作并且与C99兼容吗?若否,原因为何?如果是香草C99,我只使用stdio和stdlib,如果在Cygwin上运行,则使用率为99.9%,在任何Linux上都可以运行。我从来没有见过一个不起作用的案子


相反的情况并不总是正确的,我估计是98%,因为在某些情况下,链接可能会让人头疼

你永远无法确定。即使您的程序看起来正常工作,它也可能包含调用未定义行为的bug

但是,您可以通过使用最佳做法来降低故障风险,例如:

注意编译器警告

打开编译器警告。例如:

gcc -Wall -Wextra -pedantic -std=c99
这会将警告级别提高到相当高的级别。编译器警告通常是错误的指示,所以请修复它们。要确保修复它们,请添加-Werror,以便在修复所有警告之前无法运行代码

-std=c99告诉编译器使用C标准c99版本的规则。目前的版本是C11-stdc11。这是一个重要的标志,如果省略,gcc默认为旧的C89标准

使用工具检测内存的无效使用


Valgrind linux等工具将报告常见的内存错误,如缓冲区溢出和内存泄漏。不确定Windows中最常用的工具是什么,但有很多选择。

Lol请告诉我,不要投票。你可以通过这种方式帮助其他人。信息太少,特别是没有代码,很难帮助你。但如果您只使用标准库,而不在代码中写入文件名,它可能会像在您的计算机上一样在linux上编译和运行。确保编译时使用-Wall标志,并且没有警告如果代码是纯C,并且没有使用任何特定于平台的代码,那么它应该可以在任何兼容的编译器上工作。请注意,代码应该可以工作,但可执行文件不能工作。C是唯一独立于平台的源代码。此外,要在其他平台上进行检查,您可以使用诸如ideone或coliruSorry之类的在线编译器。我没有包括代码,因为我的同学可能会发现这个问题,看到我的代码,并在他们的项目中使用它。我的老师会杀了我的lol。好的,谢谢,顺便说一句,我忘了提到我也使用了string.h,可以吗?如果是香草C99,它将在任何有C99编译器的平台上运行。不是99.9%的时候,总是这样。这就是语言标准的全部要点。Cygwin完全是为了其他东西——那些Unix/Linux API中C99没有涵盖的部分。始终是理论。此外,编译器的C99合规性也无法用大量从未有过的工作来证明。如果它不起作用,那是因为程序、编译器或库不符合要求。我已经实现了C99库的大部分,包括测试,用于跨平台使用。但这与问题无关。你的答案并没有回答IMHO这个问题。你能为每个Linux发行版上使用的每个编译器变量声明它们是C99 100%兼容的吗?我怀疑。对于其他人,请随意不同意我的观点。这个问题与编译器错误或任何给定实现的限制无关。这是关于Cygwin的,以及用户可以依赖多少Cygwin上的工作意味着可以在Linux上工作。你的答案是OT。因为你似乎不愿意改进,所以被否决了-也许是Wextra-华尔街只是一条底线,真的是一个令人讨厌的用词不当的地方。现在应该是-std=c11了。@DevSolar-Wextra很好。添加!OP明确提到代码应该是C99。我在-std上添加了一些额外的信息以供澄清。-也许是Werror?另外,valgrind将是一个Linux工具。@jxh谢谢。我添加了一个指向Windows替代品列表的链接,并添加了一个关于-Werror的说明。此外,除非同时启用优化,否则大多数未初始化的变量警告不会显示。