|
1
2
我通常只是从建筑中找到所有的围墙
除了最复杂的头文件(即那些具有大量嵌套条件编译语句的头文件),这通常对所有头文件都很快起作用。对于这些,我通常会查看预处理器输出,以标识头文件中最后一行,该行将其发送到编译器输入流。 几乎可以肯定的是,下一行将是一个条件编译语句,其中您还没有满足包含条件。
例如,如果
this
是头文件,您需要跟踪才能看到
|
|
|
2
1
恐怕不行,你必须寻找围绕你感兴趣的领域的ifdef,找出那些符号没有定义的原因。如果它正在移植到Linux/Unix,并且标准头文件中缺少某些内容,那么您可能没有在makefile或config.h中定义正确的xopen-source或bsd-source。 |
|
|
3
1
最可能的原因是在定义的周围有一个定义。由于相应的符号没有定义或定义为其他值,因此即使包含了头本身,也不包括定义。你得手动检查这个。 |
|
|
4
1
陈瑞蒙有一个 blog post 关于这个。
解决方案:
使用
来源:
Use the
|
|
|
5
1
我认为除了检查预处理器输出以了解包含或不包含一个文件之外,没有更好的方法。 Here 是GCC的预处理器的输出格式,可以帮助您理解预处理器的输出。 另外,还有一种方法,您可以尝试比较正在移植的输出和现有的输出。 |
|
6
1
你说:
如果尝试嵌入
您还将讨论在应该定义结构的文件上运行预处理器,并且您会看到枚举来自头,而不是结构定义。这意味着可能您有一个无意中删除结构的错误注释,或者您有一个嵌入在
我将只在包含结构定义的头上运行C预处理器,以查看生成的内容;它将比尝试查看整个程序(源文件)的输出更短。如果我不能迅速发现问题,我会用一些散乱的枚举来标记部分,看看哪些能通过,哪些不能。 |