我知道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的文件,而不是默认的头文件。
所以,我尝试了两个选项:
1)在所有文件中注释掉这一行// #include_next <stdio.h>
。
2)或者用#include <stdio.h>
替换#include_next。
我不知道选择1)是否会导致任何问题(最后的链接器错误)。
关于2),我得到了fatal error C1014: too many include files : depth = 1024
,这也很好。为此,我会使用wrapper #ifndef
作为 include guards 或# pragma once
指令。
以下是我的担忧:
我是否需要在头文件stdio.h中编写#include <stdio>
或#include "stdio.h"
之类的语句?编译Windows时是否有意义?仅仅在需要的所有源文件中直接执行#include "stdio.h"
就不够了,所以它会绕过Visual C标准头而不是使用我的?
而且,如果我完全省略语句include_next,可能/可能不会发生什么?
我的主要目标是使用MSVC成功编译gnu库。 如果我遗漏了某些内容,或者对这个主题有更多了解,请纠正我。
答案 0 :(得分:3)
选项1和2都不起作用。它是一个包装系统的标题。因此,如果您将其注释掉,系统标题将不会被包含在内,并且它的定义将会丢失。如果将其更改为普通#include
,它将再次包含相同的标题,从而导致无限循环。
Boost使用
#include <../include/stdio.h>
这适用于WinNT,因为所有标准标头恰好位于名为include
的目录中。它也适用于标准的WinCE SDK,但遗憾的是它并不适用于所有这些。