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

Posted

技术标签:

【中文标题】GCC 10.0.1 接受包含不在基本源字符集中的字符的标头名称【英文标题】:GCC 10.0.1 accepts header name with characters that are not in the basic source character set 【发布时间】:2020-09-20 00:01:43 【问题描述】:

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

5.8 标题名称

标题名称: " q-char-sequence " h字符序列: h-char h-char 序列 h-char h字符: 源字符集的任何成员,除了换行符和 > 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 _ [ ] # ( ) % : ; . ? * + - / ^ & | ~ ! = , \" '

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

#include "header³.h"

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

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

【问题讨论】:

gcc 实现了许多 C 或 C++ 标准中未指定的东西。这显然是其中之一。 gcc 并不真正关心每个源文件的名称是什么。一个特定名称的文件中的 C 或 C++ 代码与具有不同名称的文件中的相同 C 或 C++ 代码一样好。 我猜大多数编译器都可以使用在文件系统上有效的任何名称。 根据this identifier reference,允许使用大量的 Unicode 字符。您确定特定角色不在允许的集合之一中吗?您是否尝试过以严格的标准合规性进行构建(没有 GCC 特定的扩展)?你如何建立你的minimal reproducible example? 我会尝试关闭 GCC 特定的扩展。没想到。非常感谢:) 更不用说编译器"searches for the file in implementation-defined manner"(强调我的)。 【参考方案1】:

gcc 的行为不违反标准。

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

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

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

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

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

【讨论】:

以上是关于GCC 10.0.1 接受包含不在基本源字符集中的字符的标头名称的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:字典包含不在字段名中的字段:无

XAML WebView绑定到不在Xamarin Forms中的字符串

linq - 您如何查询一个查询源中不在另一个查询源中的项目?

ubuntu怎么安装gcc编译器

将 ARM 代码从 rvds 转换为 linux gcc 源

从 Python 字符串中删除不在允许列表中的 HTML 标记