GCC 10.0.1接受具有不在基本源字符集中的字符的标头名称

  • 本文关键字:字符 集中 字符集 GCC c++ gcc g++
  • 更新时间 :
  • 英文 :


我目前正在阅读C++标准参考(C++17(
我阅读了以下关于标题名称的内容:

5.8标题名称

标头名称:
<h-char-序列>
"q-char-序列">
h-char-sequence:
h-char
h-char-sequence-h-char
h-char:
除了换行符和>
q-char-sequence:
q-char
q-char-sequence-q-char
q-char:
除了换行符和">

源字符集由以下字符组成:

5.3字符集

基本源字符集由96个字符组成:
空格字符、表示水平制表符、垂直制表符的控制字符、
表单馈送和新行,加上以下91个图形字符:
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
_{}[]#((<gt;%:;.?*+-/^&|~!=,\"'

我创建了一个名为header³.h的文件
我在一个cpp文件中尝试了以下操作,它编译时没有出现错误:

#include "header³.h"

我用GCC 10.0.1版编译器编译了这个。

所以现在我想知道为什么要编译这个
是否有我忽略或误解的地方?

gcc的行为没有违反标准。

#include指令中""<>之间的字符是源字符集的成员。基本源字符集仅限于您列出的96个字符。源字符集可能包括其他实现定义的字符。

在快速浏览C++标准时,我找不到一个非常清晰的说法,但确实使用了短语";基本源字符集";以及";源字符集";在不同的背景下,所以至少可以合理地假设它们不一定相同。C标准更为明确;参见N1570 5.2.1第1段(。(

即使它确实违反了标准,gcc/g++在默认情况下也不符合标准,尤其是它没有发布所有必需的诊断。要在一致模式下编译,可以使用

g++ -std=c++17 -pedantic

g++ -std=c++17 -pedantic-errors

最新更新