【问题标题】:GCC 10.0.1 accepts header name with characters that are not in the basic source character setGCC 10.0.1 接受包含不在基本源字符集中的字符的标头名称
【发布时间】: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"(强调我的)。

标签: c++ gcc g++


【解决方案1】:

gcc 的行为不违反标准。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2019-06-02
    • 2020-02-04
    相关资源
    最近更新 更多