0

我已经将一些文件从我的 windows 机器复制并粘贴到我的 linux 机器上,并在 conio.h 和 Windows.h 头文件中遇到了一些可以理解的问题,但我不记得它们需要什么。

它们只在主函数中,所以我将它们注释掉并再次运行程序,认为错误会告诉我需要它们的位置,这样我就可以用谷歌搜索哪些标题对 linux 有类似的作用。

我遇到的问题是我得到的所有错误都在我包含在主函数中的头文件中,但没有包含 Windows.h 或 conio.h 头文件。

我的问题是如何/为什么: - 编译器是否依次查看每个头文件,进入 windows.h 头文件并停止,然后当它被注释掉时,它会进入我的“Chapter_7.h”头文件并找到所有问题在那里。

或者 main.cpp 中标题的注释会以某种方式影响我编写的标题。

或者(可能更有可能)我忽略了另一种选择吗?

感谢您的任何回答。

4

3 回答 3

1

这是由于.h文件在.cpp. 在编译过程中,头文件中的所有文本都被复制粘贴到包含.cpp文件中。这意味着以后.h的文件可以访问较早的文件

这看起来就是您的情况正在发生的事情,windows.h本来是第一个 include,并且后续的标头一直在使用它。

//#include <window.h>  
//#include <conio.h>
#include "myheader.h"    // can no longer use windows.h or conio.h
#include "myheader2.h"
于 2013-01-13T11:50:33.333 回答
1

你可以说标题内容被复制粘贴到它们包含的文件中,如果这就是你的意思的话。

或者 main.cpp 中标题的注释会以某种方式影响我编写的标题。

确实。认为:

//header1.h
#define X 1

//header2.h
#ifdef X
int a = 0;
#else
int a = 1;
#endif

aheader1.h如果包含在之前或之后,将有不同的定义header2.h

于 2013-01-13T11:52:44.203 回答
1

修复“我正在使用我无法在这台机器上使用的头文件”的第一步是删除这些文件,编译代码并查看问题所在 - 它几乎总是会产生编译器错误,所以你应该能够找到这很容易。

conio.h允许控制台 io,并且可能需要一些工作才能将其修复到 Linux 中。完全取决于您使用的是什么。

windows.h解释起来要复杂得多,因为它本质上为您提供了所有的 Windows API 函数,以及大量的类型声明,而且其中有很多。您的程序可能永远不会[直接]使用其中的大多数。

“使用其他地方不存在的头文件”的常见问题之一是您最终使用了头文件中声明的某些类型。例如,windows.h将声明 LONG、HANDLE 和大量其他类型。然后这些类型在其他地方的结构和函数声明中使用,当您删除windows.h它时,将导致各种后续问题。

我的方法总是先解决第一个问题,然后再编译。这样做的原因是,如果出现奇怪的东西,编译器经常会“混淆”。这有点像如果你要告诉一个朋友如何开车去你家,你会说“当你看到左边的大橡树时,你就走下一个右边”。你不知道,这棵橡树已经被砍倒了,因为它快死了,现在已经不存在了。所以你的朋友开车到原来那棵橡树的地方,然后在路上的另一棵橡树后面右转。当然,现在所有其他指令都完全没用了,因为你的朋友离正确的道路很远,如果没有新的指令,你永远不会找到你的房子。当编译器在源文件中发现“令人惊讶的”或“缺失的”位时,也会发生同样的事情。因此,修复第一个错误,然后编译、修复、编译,通常可以让您达到代码编译的程度。有时这涉及编写这样的新函数:

int GetTimeOfDay(void)
{
    printf("%s:%d:%s: doesn't work yet, exiting...", __FILE__, __LINE__, __func__);
    exit(1);
    return 0;  // to keep compiler happy. 
}

编译完所有代码后,您就开始研究如何实现/替换您添加以使其编译的那些函数。

于 2013-01-13T12:02:06.467 回答