【问题标题】:include_next preprocessor directive causing problems in MSVC在 MSVC 中导致问题的 include_next 预处理器指令
【发布时间】:2013-03-08 12:53:44
【问题描述】:

我知道 inlcude_next 恰好是 C 预处理器的 GNU 扩展。 我在使用 MSVC 编译 Gnu 库代码时遇到问题。例如,有一个 stdio.h 头文件或更确切地说是GNU-like <stdio.h>。使用 MS 编译器编译时,我得到 invalid preprocessor command 'include_next',这很好,因为没有什么像 Windows 的 #include_next 指令。 #include_next 的主要目的是您想在项目中创建一个名为 stdio.h 的文件,该文件将被包含在内,而不是默认标题。

所以,我尝试了 2 个选项: 1)在所有文件中注释掉这一行// #include_next <stdio.h>。 2) 或者将#include_next 替换为#include <stdio.h>

我不知道选择 1) 是否会导致任何问题(最后出现链接器错误)。 关于 2),我得到了fatal error C1014: too many include files : depth = 1024,这也很好。为此,我将使用wrapper #ifndef 作为包含警卫# pragma once 指令。

以下是我的担忧:

我需要在头文件stdio.h中写#include <stdio>#include "stdio.h"这样的语句吗?为 Windows 编译时是否有意义。直接在它需要的所有源文件中直接执行#include "stdio.h" 是否就足够了,这样它就可以绕过Visual C 标准头文件而使用我的头文件? 而且,如果我完全省略语句 include_next,可能/可能不会发生什么?

我的主要目标是使用 MSVC 成功编译 gnu 库。 如果我遗漏了什么或者可能对这个主题有更多的了解,请纠正我。

【问题讨论】:

  • “我的目标是使用 MSVC 成功编译 gnu 库” - 请参阅 gnuwin32.sourceforge.net
  • @roger_rowland 我的意思是我拥有的代码有 include_next。它们不是精确的 gnu 库。我可以从上面的链接中使用。但应用需求不同

标签: c windows gnu visual-studio-2010


【解决方案1】:

选项 1 和 2 都不起作用。它是包装系统的标头。因此,如果您将其注释掉,系统标头将不会被包含在内,并且它的定义将丢失。如果你把它改成普通的#include,它会再次包含相同的标题,导致无限循环。

提升用途

#include <../include/stdio.h>

这适用于 WinNT,因为所有标准头文件都恰好位于名为 include 的目录中。它也适用于标准的 WinCE SDK,但遗憾的是并非对所有这些 SDK 都适用。

【讨论】:

  • 不错的组合 - #include_next 无论如何都是documented
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多