如何在C和/或C++中包含文件
How to include a file in C and/or C++
我有一个头文件,我正试图使用include
预处理器目录从另一个源文件中包含它。我试过使用引号形式和角度制动形式,但似乎都不起作用。
文件名为.>"hello.h
,是编译器搜索该文件的目录。我试着把它包括在内:
#include <.>"hello.h>
#include <.>"hello.h>
#include <.>"hello.h>
#include ".>"hello.h"
#include ".>"hello.h"
我还尝试了不同的C和C++编译器——clang、gcc、clang++和g++。
显然,以上这些都不起作用,否则就毫无疑问了。
我想,按照标准,这个名字可能不合法。不幸的是,我手头既没有C也没有C++标准规范。我能找到的唯一权威信息来源是关于#include
指令和GNUC预处理器文档的MSDN页面。GNU的文档没有说太多,MSDN有以下条款:
路径规范是一个文件名,可以选择在其前面加一个目录规格文件名必须命名现有文件。的语法路径规范取决于程序所在的操作系统编译。
我很好奇C和C++标准对此有何看法?
在哪里可以找到C和C++头文件命名要求的特定于操作系统的规则?我对OSX、Linux和FreeBSD特别感兴趣。
为什么转义<
和/或"
字符无效?
如何包含我的文件?
我想你对draft C99 standard
节6.4.7 Header names
中的文件名不太满意,语法如下:
header-name:
< h-char-sequence >
" q-char-sequence "
h-char-sequence:
h-char
h-char-sequence h-char
h-char:
any member of the source character set except
the new-line character and >
q-char-sequence:
q-char
q-char-sequence q-char
q-char:
any member of the source character set except
the new-line character and "
文件名中同时包含"
和>
,这将您排除在q-char
和h-char
规范之外。我认为你别无选择,只能更改文件名。
draft C++ standard
第2.9 Header names
节中的语法相同。
在C和C++中,这都不是有效的头名称,因为它同时包含>
和"
。
标题名称的语法允许由<>
分隔的标题名称包含"除换行和>
之外的源字符集的任何成员",而由""
分隔的标题名包含"除新行和"
之外的任何源字符集成员"。没有转义序列的概念。
"和>不是Windows中文件名的有效字符。您的文件名应该是hello.h、.\hello.h或..\hello.h,但不是。>"hello.h
#include "hello.h"
#include ".hello.h"
#include "..hello.h"
#include "c:/temp/hello.h"
这就是为什么你在MSDN中找不到关于它的任何信息。
ext3允许大多数字符(使用时必须转义几个字符),但强烈建议在命名头文件和源文件时不要使用它们(如果不是因为可读性以外的原因)。有关详细信息:http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.bg.doc%2Flanguage_ref%2Fc99preprocessor.html
什么是可接受的文件名是由实现定义的。我本以为#include ".>"hello.h" to work, at least
on systems where
'>'and
'"'`在文件名中是合法的,但没有要求它工作,而且很明显因为这样的名字在美国是不合法的系统
你可以尝试强制问题:
#define NAME ".>"hello.h"
#include NAME
但出于实际目的,您应该将文件名限制为字母数字、下划线和可能是连字符(但我会leary)。只有一个点,在扩大如果你去找麻烦,如果你找到了。
当然,这回答了你的最后一个问题:我该如何包括文件。你把它重命名为合理的名称。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)