首页 > 解决方案 > GCC 10.0.1 接受包含不在基本源字符集中的字符的标头名称

问题描述

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

5.8 标题名称

header-name:
    < h-char-sequence >
    " q-char-sequence "
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 个图形字符:
abcdefghijklmnopqrstu vwxyz
ABCDEFGHIJKLMNOPQRSTU VWXYZ
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ != , \" '

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

#include "header³.h"

我用 GCC 版本 10.0.1 编译器编译了它。

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

标签: c++gccg++

解决方案


gcc 的行为不违反标准。

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

快速浏览一下 C++ 标准,我找不到一个非常明确的说明,但确实在不同的上下文中使用了“基本源字符集”和“源字符集”这两个短语,所以至少可以合理地假设它们'不一定相同。C 标准更加明确;见N1570 5.2.1 第 1) 段。)

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

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

或者

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

推荐阅读