c++ - 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 编译器编译了它。
所以现在我想知道为什么要编译这个。
有什么我忽略或误解的吗?
解决方案
gcc 的行为不违反标准。
指令之间""
或指令中的字符是<>
源字符集的成员。基本源字符集限于您列出的 96 个字符。源字符集可能包括附加的实现定义的字符。#include
快速浏览一下 C++ 标准,我找不到一个非常明确的说明,但确实在不同的上下文中使用了“基本源字符集”和“源字符集”这两个短语,所以至少可以合理地假设它们'不一定相同。C 标准更加明确;见N1570 5.2.1 第 1) 段。)
即使它确实违反了标准,默认情况下 gcc/g++ 也不符合标准,特别是它不会发出所有必需的诊断。要以一致模式编译,您可以使用
g++ -std=c++17 -pedantic
或者
g++ -std=c++17 -pedantic-errors
推荐阅读
- reactjs - 您可以在组件上使用样式组件关键帧内联吗?
- javascript - 使用 Devise 登录时遇到问题 - JSON.stringify 转义字符
- powershell - 模拟按下 windows 键的 powershell 代码是什么?
- sql - 作者相关书籍的计数错误为什么以及如何解决?
- wolfram-mathematica - 2组二维点间仿射变换矩阵的闭式解
- javascript - 如何处理来自 Node.js 中 API 的 HTTPs json 格式错误?
- c - 为什么我应该在 CTRL+D 之前按 ENTER 以指示标准输入的 EOF?
- apache-spark - Spark RDD 将 csv 文件中的所有字段加载为字符串
- java - 尝试添加新用户时出现 Spring Security 403 错误
- reactjs - 如何使用钩子在我的反应应用程序中编辑待办事项?