8

我有一个头文件,我试图使用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++ 标准规范。我能找到的唯一权威信息来源是这个关于指令的 MSDN页面#include和 GNU C预处理器文档,这里是。GNU的文档不多说,MSDN有如下条款,不过:

path-spec 是一个文件名,前面有一个目录规范。文件名必须命名现有文件。path-spec 的语法取决于编译程序的操作系统。

我很好奇C和 C++ 标准对此有何评论?

我在哪里可以找到那些针对C和 C++ 头文件命名要求的特定于操作系统的规则?我对 OS X、Linux 和 FreeBSD 尤其感兴趣。

为什么转义<和/或"字符不起作用?

如何包含我的文件?

4

4 回答 4

10

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 "

您同时拥有 a">in 文件名,这将您排除在q-charandh-char规范之外。我认为您别无选择,只能更改文件名。

draft C++ standard, 部分的语法相同2.9 Header names

于 2013-08-15T17:38:05.847 回答
5

在 C 和 C++ 中,这不是一个有效的标头名称,因为它同时包含>"

标题名称的语法允许由 分隔的那些<>包含“除换行符和之外的源字符集的任何成员>”,而由 分隔的那些""包含“除换行符和之外的源字符集的任何成员"”。没有转义序列的概念。

于 2013-08-15T17:36:23.593 回答
2

" 和 > 不是 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

于 2013-08-15T17:35:57.007 回答
0

什么是可接受的文件名是实现定义的。我原以为#include ".>\"hello.h" to work, at least on systems where'>' and'"'` 在文件名中是合法的,但并不要求它工作,而且显然有些系统不会,因为这样的名称在系统中是不合法的。

您可以尝试强制问题:

#define NAME ".>\"hello.h"
#include NAME

但出于实际目的,您应该将文件名限制为字母数字、下划线,也许还有连字符(但我也会对这些保持警惕)。并且只有一个点,在扩展之前。如果你去寻找麻烦,如果你发现它,不要感到惊讶。

当然,这回答了您的最后一个问题:我如何包含文件。您将其重命名为合理的名称。

于 2013-08-15T17:40:19.417 回答