【问题标题】:#include guards does not work and #pragma once is obsolete#include 守卫不起作用并且#pragma once 已过时
【发布时间】:2016-09-17 13:29:06
【问题描述】:

有两个头文件_stub_defs.h

///存根代码
#pragma 一次
#include "random.h"
#include

和 stasrg.h

#ifndef __GNUC_VA_LIST
#define __GNUC_VA_LIST
typedef __builtin_va_list __gnuc_va_list;
#endif

当我使用我的交叉编译器(sparc-rtems-gcc)进行编译时,两个头文件都包含在内。然后终端告诉我:

警告:#pragma once 已过时
stdarg.h:`__gnuc_va_list' 的类型冲突

stdarg.h: `__gnuc_va_list' 的先前声明

很明显,#include 守卫不起作用。这是头文件代码的问题还是我的交叉编译器的问题?

【问题讨论】:

  • _stub_defs.h 是工具链标题还是您可以修改它?如果你可以在那里使用stasrg.h的相同方法。
  • 当然包含警卫工作。该符号必须已在其他地方定义。
  • 你从哪里得到stasrg.h? (这不是我遇到的标准标题——它是<stdarg.h> 的拼写错误?)如果你写了它,你就没有资格这样做。也就是说,如果您在 C11 模式下编译并且 typedef 相同,则不应出现该错误。你应该去掉#pragma once——只要不被滥用,标题保护就可以工作。

标签: c include cross-compiling


【解决方案1】:

包含警卫工作。你还有一个问题。

最好的调试方法是只运行 C 预处理器。对于 gcc(包括交叉编译器 gcc),您可以使用 -E 选项。只需将其添加到您的编译阶段。在预处理阶段之后,您将获得一个 C 文件,而不是获取目标文件。

获取该文件,并在那里搜索重复的定义。该文件还将具有告诉编译器此定义最初来自哪个文件的标记,以及嵌套包含时的标记。如果您遵循这些,您将看到这两个定义的来源以及每个定义包含在哪个文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2010-11-11
    相关资源
    最近更新 更多