纯C语言代码加上C编译器,等于跨平台代码吗?

3
如果我有一段完全用C语言编写的代码,只使用了同样用C语言编写的库,并且我有一个编译器,如GCC,支持许多平台,那么我可以确定这段代码将在编译器支持的任何架构上运行吗?例如,我可以拿FlexCPython进行编译和使用,在AVR上运行,对吗? 编辑:
  • 当然是编译和运行
  • 没有图形界面

1
请参阅为什么编写可移植的C程序很困难?以了解一些现有的讨论。简短的版本是:标准和标准库对用户IO、文件系统细节和网络访问等方面提供了有限的支持,因此“纯”程序是可移植但受限制的。 - dmckee --- ex-moderator kitten
5个回答

5

没有看到你的代码,很难说。例如,如果你依赖于 long 是4个字节,那么在64位机器上就不正确了。


但是它会编译 :-) 他请求编译而不是运行 :-) :-) 他甚至可以尝试使用 malloc 分配 2GB 的内存。在 32 位系统上可能无法正常工作。 - xanatos
3
他确实使用了"compile"这个词,但你认为仅此就足够了吗?我认为原帖作者想要的是跨平台代码。 - Mu Qiao
@xanatos:嗯,他也说“使用它”。;-) 我猜这意味着“成功运行它”。 - Rudy Velthuis
@xanatos:它可能编译,也可能不编译,这取决于依赖关系的性质: int foo[sizeof(long) == 4 ? 1 : -1]。这正是在编写代码时静态地断言任何你对实现细节的假设的好方法,试图阻止它编译。 - Steve Jessop

3

在你的情况下应当保证源代码可移植性和可编译性。

如果您使用依赖特定操作系统的外部库或GUI框架,可能会发生变化,但这不是您的情况,所以您应该可以顺利进行。


3
"完全使用C编写"并不意味着代码是可移植的。像GCC这样的可移植编译器抽象了CPU架构细节,但是一旦您使用特定于某个操作系统的系统调用,除非将该片段包含在#ifdef WHATEVER_OS中,否则您的代码就会变得不可移植。这就是为什么出现了像POSIX这样的标准,以统一跨不同操作系统的系统调用接口。

将您的代码限制为POSIX定义的系统调用,并使用符合POSIX标准的操作系统,通常应该可以避免担忧,只有少数例外。


2
回应是“它们可能会编译,但有可能无法运行”。问题在于您拥有的资源。假设您为2GB的计算机编程。您的程序能在256MB的计算机上运行吗?DOS计算机能运行CPython吗?但是它们可能会编译 :-) (从技术上讲,您的代码太大了,无法适应目标计算机的地址空间。如果您的.exe/.out文件大小为18MB,而目标计算机的地址空间为16MB,则甚至无法编译)。

2

仅仅使用C语言并不能保证代码在任何支持C语言的平台上都是可移植的。有很多陷阱需要避免,比如依赖于类型大小、字节序或未定义行为。

实际上,一个非平凡的程序很少能够在除了你已经验证过它可以运行的平台上进行移植。但你可以采取措施来尝试减少问题的发生几率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接