【问题标题】:Header files c++ windows to linux conversion头文件 c++ windows 到 linux 转换
【发布时间】:2013-01-13 11:47:32
【问题描述】:

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

它们仅在 main 函数中,所以我将它们注释掉并再次运行程序,认为错误会告诉我需要它们的位置,这样我就可以在 google 上搜索哪些标头对于 linux 可以类似地工作。

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

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

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

或者(可能更有可能)我忽略了其他选择吗?

感谢您的任何回答。

【问题讨论】:

  • <windows.h> 头文件包含所有 Window 特定的函数和结构,即整个 WIN32 API。 <conio.h> 头文件用于控制台(即命令提示符窗口)处理,也是 Windows 特定的。
  • 值得注意的是conio.h已经过时了。
  • 学习更多关于 Linux 编程的知识可能是值得的,尤其是阅读像 advancedlinuxprogramming.com 这样的书籍,并认识到 X11 服务器和图形工具包(如 Qt)对于 GUI 应用程序的重要性和特殊性。

标签: c++ linux header-files


【解决方案1】:

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

这看起来就是您的情况,windows.h 将是第一个包含,随后的标头一直在使用它。

//#include <window.h>  
//#include <conio.h>
#include "myheader.h"    // can no longer use windows.h or conio.h
#include "myheader2.h"

【讨论】:

    【解决方案2】:

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

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

    当然。假设:

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

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

    【讨论】:

      【解决方案3】:

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

      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. 
      }
      

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

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多