代码之家  ›  专栏  ›  技术社区  ›  machinaut

如何从C中的include文件中查找结构丢失的原因?

  •  0
  • machinaut  · 技术社区  · 17 年前

    我正在移植一个相当大的项目,在其中一个头文件中,我包含了一个包含pmc-mdep结构定义的文件。(之前在文件中声明,但后来实际定义)。

    试图编译它会给我带来关于该结构是不完整类型的错误(我相信这意味着它缺少定义)。

    当我在此项目上运行预处理器时,它确实包含该文件,但预处理器输出没有结构定义(但包含来自该文件的枚举)。

    有没有一种方法可以弄清楚为什么头文件中的某些文件会到达预处理器输出,而有些则不会?

    蒂亚

    (此外,这不是唯一的编译错误,端口完成了一半,但至少应该通过这一部分)

    6 回复  |  直到 17 年前
        1
  •  2
  •   paxdiablo    17 年前

    我通常只是从建筑中找到所有的围墙 "#ifdef" "#if" 预处理器将遇到的行,并查看哪个行控制将结构从输入流中删除到编译器中。

    除了最复杂的头文件(即那些具有大量嵌套条件编译语句的头文件),这通常对所有头文件都很快起作用。对于这些,我通常会查看预处理器输出,以标识头文件中最后一行,该行将其发送到编译器输入流。

    几乎可以肯定的是,下一行将是一个条件编译语句,其中您还没有满足包含条件。

    例如,如果 this 是头文件,您需要跟踪才能看到 _KERNEL 为了得到声明和定义,应该定义。

        2
  •  1
  •   florin    17 年前

    恐怕不行,你必须寻找围绕你感兴趣的领域的ifdef,找出那些符号没有定义的原因。如果它正在移植到Linux/Unix,并且标准头文件中缺少某些内容,那么您可能没有在makefile或config.h中定义正确的xopen-source或bsd-source。

        3
  •  1
  •   sharptooth    17 年前

    最可能的原因是在定义的周围有一个定义。由于相应的符号没有定义或定义为其他值,因此即使包含了头本身,也不包括定义。你得手动检查这个。

        4
  •  1
  •   John Kugelman Michael Hodel    17 年前

    陈瑞蒙有一个 blog post 关于这个。

    你可能会发现自己在一个曲折的迷宫中 #ifdef 或者你可能想知道为什么你的宏不能工作。

    我的头文件中有这些行:

    #define MM_BUSY     0x0001
    #define MM_IDLE     0x0002
    

    但当我尝试使用它们时,我会出错。

    sample.cpp(23): error C2065: 'MM_BUSY': undeclared identifier
    sample.cpp(40): error C2065: 'MM_IDLE': undeclared identifier
    

    知道为什么会这样吗?

    解决方案: 使用 #error 以同样分散的方式追踪问题 printf 找到一个普通的虫子。

    来源: Use the #error directive to check whether the compiler even sees you

        5
  •  1
  •   Sam Liao    17 年前

    我认为除了检查预处理器输出以了解包含或不包含一个文件之外,没有更好的方法。 Here 是GCC的预处理器的输出格式,可以帮助您理解预处理器的输出。

    另外,还有一种方法,您可以尝试比较正在移植的输出和现有的输出。

        6
  •  1
  •   Jonathan Leffler    17 年前

    你说:

    我正在移植一个相当大的项目,在其中一个头文件中,我包含了一个包含pmc-mdep结构定义的文件。(之前在文件中声明,但后来实际定义)。

    试图编译它会给我带来关于该结构是不完整类型的错误(我相信这意味着它缺少定义)。

    如果尝试嵌入 pmc_mdep 在定义一个 PMCY-MDEP 地。请注意,可以将指向不完整类型的指针嵌入到结构中,但不能嵌入不完整类型的实际实例。

    您还将讨论在应该定义结构的文件上运行预处理器,并且您会看到枚举来自头,而不是结构定义。这意味着可能您有一个无意中删除结构的错误注释,或者您有一个嵌入在 #ifdef XXX #endif 但是 XXX 在进行编译时未定义。甚至可能是 #if 0 .

    我将只在包含结构定义的头上运行C预处理器,以查看生成的内容;它将比尝试查看整个程序(源文件)的输出更短。如果我不能迅速发现问题,我会用一些散乱的枚举来标记部分,看看哪些能通过,哪些不能。

    推荐文章