编译C ++代码在Windows和Linux中的行为相同

时间:2013-04-01 13:01:03

标签: c++ linux windows g++ cygwin

我已经安装了cygwin并用它在Windows上编写C ++程序。

我更喜欢在Windows中编写代码(这些是分配),但代码也需要能够在Linux上运行。虽然代码端口大部分时间都存在,但有些东西在Windows上有效,但会导致Linux上的段错误(例如引用未初始化的变量和指针)。

我在两个Windows(通过C:\ cygwin \ bin \ g ++。exe)和Linux中使用g ++编译,我不明白为什么在前者中起作用的代码在后者中失败(或者为什么它们不是简单的表现相同)。如何使我的代码在两者中的行为完全相同?这甚至可能吗?

虽然我是C ++菜鸟,但我没有使用任何特定于Windows的库,所以我可能误解了一些简单/重要的东西。最后我知道使用未初始化的变量和指针是不好的 - 我想在Windows中使用它们导致分段错误。

2 个答案:

答案 0 :(得分:1)

您在“引用未初始化的变量和指针”中所描述的内容称为未定义行为。这意味着“你的运气可能会有所不同” - 它可能在一个系统上以某种方式执行某些操作,而在另一个系统上执行其他操作。不幸的是,作为“C和C ++应该是高效语言”的一部分,未定义行为的行为就是这样 - 编译器不需要关心它,并且C或C ++标准中没有任何内容定义什么应该发生。

如果将-Wall应用于编译器,它应该为您提供几乎所有类型的未初始化变量的警告。

无论何时声明变量,您都可以为其指定一个值。这样做绝不是一个坏主意。即使只是为它分配一些无用的值,它也比在四层嵌套循环内部深处确定计算出错的原因要好。

您也可以尝试使用Microsoft Visual Studio工具 - 这些工具有免费的“Express Edition”。如果使用调试模式进行编译,它将生成额外的代码(尝试)检测未初始化变量的使用。

我不知道一个“库”,它允许你对未初始化的变量进行错误。

答案 1 :(得分:1)

  

例如引用未初始化的变量和指针

完全。根据我的经验,我看到在Windows上编译的C ++代码(带有Visual C++MinGW GCC)指针未初始化为NULL。

所以这样的事情不会发生段错误。 (你没有得到你想要的东西,但至少你不知道它。残忍。)

int *p;
*p = 1;
std::cout<<*p;

然而,在Linux系统(GCC)上,至少似乎将它们初始化为NULL。所以上面的代码将是段错误的。

最佳解决方案是为您正在使用的编译器打开未初始化的变量警告(gcc Wuninitialized),然后告诉它将所有警告视为错误(gcc Werror)。

至少在尝试移植代码之前,您可以这样做。

为了更好的分析,您可以使用valgrind等工具。