0

我是 C 新手(来自 Java,所以我不是第一次学习编程)。我正在读《C Primer Plus》这本书。我一直在四处寻找以了解在 Windows 上开发 C 程序的编译器或环境之间的差异。

我已经安装了 MinGW 和 Visual Studio 2010。我已经测试了在这两个环境中编译一个 hello world。对于 MinGW,我正在考虑 Code::Blocks 或 vim。Code::Blocks 上的多编译器支持听起来很方便,但我还没有达到这个水平,无法理解这个功能会有多大帮助。

我愿意以我应该的方式学习 C,而不是被像 Visual Studio 这样的 IDE 隐藏的工作背景所宠坏。一旦我提高了理解力,我不介意切换到更方便的环境。

我对 Visual Studio 感到不舒服的原因是它不像 gcc 那样支持标准。我已经阅读了一个论点,即 VS 在生产中被广泛使用,并且这就是它的方式。有人说只要在我不想要的地方开始写 C。我已经看到有人说体验命令提示符并查看链接是如何完成的,等等。

这是来自维基百科,但它说 Visual C++ 不应该用于编译 C。http://en.wikipedia.org/wiki/Visual_C%2B%2B#Issues

所以这里是我需要说清楚的。可能是几个街区。

我的理解是,只要我正在为 Windows 平台进行开发,Visual Studio 就适用,并且也适合那些只想开始编码的人。

如果我想采用更新的标准并使用 gcc(在 Linux 中使用),我应该选择 MinGW。MinGW 是移植到 Windows 的最小的类似 gcc 的环境,因此我可以使用与 Linux 类似的环境,这使我受益于比 VS 更好地支持的标准。此外,这应该有助于我的程序在 Linux 上更成功地编译,而不是完全用于在 Windows MinGW 上编译程序以在 Linux 上运行,对吧?

我们所说的可移植性是在每个平台上编译一个源代码,而不是在一个特定平台上编译一个程序来使用其他平台上的执行文件,对吗?

4

3 回答 3

2

虽然 Visual C++ 不是 C 编译器,但 Visual Studio 工具确实允许编译 C 代码 - Visual Studion 下的编译器用于编译几乎所有 Microsoft 的 C 代码(Microsoft 中有很多 C 代码) Windows 系统,即使相当一部分较新的工具可能是 C,但很多东西的基础仍然是 C)。您只需要确保将 C 编译为 C,而不是 C++,因为 C++ 在某些东西的风格上略有不同——C 中允许的一些东西在 C++ 中是不允许的。

做到这一点的方法是调用文件something.c,而不是something.cpp - 这真的很容易。

gcc 也是一个非常称职的编译器,这一点毫无疑问。并且使用 Code::Blocks 等中的工具将是一个很好的学习方式。

实际上,我会说 Visual Studio 绝对是一个更流畅、更流畅的环境,如果你愿意,你仍然可以使用 make 等命令行工具来构建东西——编译器不是 IDE 的一部分,它只是一个很好的集成 IDE。学习计算机语言应该尽可能少的障碍。让自己的生活变得艰难是没有帮助的。

我个人在 Linux 上使用 (x)emacs 和 gcc,但我第一次用 C 编程时,甚至没有合适的标准,计算机通常有 8 位或 16 位处理器——我们 1985 年的学校计算机有2MB 内存和 3 个 64MB 磁盘(131000 个 512 字节的块)。那台机器在我的学校有 8 个终端,在另一所学校还有 8 个终端,而实际计算机所在的主学校有两个房间,我认为每个房间有 16 个终端。所以我们有时会在 30 个人之间共享这台机器!

于 2012-12-29T20:08:53.543 回答
1

您应该选择任何让您感觉最舒适的平台,并等待担心跨平台可移植性等的复杂性。从 Java 开始,您一开始会忙于指针等,因此请专注于它的环境。

如果您以前在 Eclipse 环境中编写过 Java,那么 C/C++ 的 CDT 插件可能是您的最佳选择。它确实支持 gcc 工具链。

问候

于 2012-12-29T20:19:40.183 回答
0

如果您要为 Windows 编译,请尝试 CodeBlocks、Dev-CPP 或 Eclipse,因为我认为它们都使用 GCC。本质上,您想要一些不会强迫您制作新解决方案/包含新项目/制作新文件的东西,这样您就可以测试一些功能。您想编译单个 .c 文件并运行它,并以该格式播放。

如果你要为 Linux 编译,试试 Geany、Eclipse 或只使用 gcc。当你在它的时候,不妨拿起makefile。

除此之外,编写 C 代码,或查看其中一些公共本机 java 调用的最终位置。但是不要看数学包,你会失望的。

编辑:刚刚注意到你的便携性。是的,您需要在每个目标上重新编译,或者使用交叉编译器。

但是交叉编译是不够的,还必须为不同的平台编写代码,比如在 Windows 中您将使用 Win API 调用 CreateThreadA(),但在 linux-build 中您可能会使用 pthread_create()。您应该熟悉使用

//some code
#ifdef __platform_windows
   //windows code here
#endif
#ifdef __platform_linux
   //linux code here
#endif
//crossplatform code
于 2012-12-29T22:55:21.440 回答