如何在C和/或C++中包含文件

How to include a file in C and/or C++

本文关键字:C++ 包含 文件      更新时间:2023-10-16

我有一个头文件,我正试图使用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 standard6.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-charh-char规范之外。我认为你别无选择,只能更改文件名。

draft C++ standard2.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)。只有一个点,在扩大如果你去找麻烦,如果你找到了。

当然,这回答了你的最后一个问题:我该如何包括文件。你把它重命名为合理的名称。