-2

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

我更喜欢在 Windows 中编写我的代码(这些是分配),但代码还需要能够在 Linux 上运行。虽然代码在大多数情况下都可以很好地移植,但似乎有些东西在 Windows 上有效,但在 Linux 上会导致段错误(例如引用未初始化的变量和指针)。

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

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

4

2 回答 2

1

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

如果你应用-Wall到你的编译器,它应该会给你几乎所有类型的未初始化变量的警告。

制定你的规则,每当你声明一个变量时,你也要给它一个值。这样做从来都不是一个坏主意。即使它只是给它分配了一些无用的值,也比试图找出为什么你的计算在四级嵌套循环深处的某个地方出错要好。

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

我不知道有一个“库”允许您对未初始化的变量进行错误处理。

于 2013-04-01T13:08:49.887 回答
1

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

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

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

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

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

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

您至少可以在尝试移植代码之前执行此操作。

要获得更好的分析,您可以使用valgrind 之类的工具。

于 2013-04-01T13:15:19.567 回答