cpp 文件中的 C++ 变量能否定义为特殊符号 β

Posted

技术标签:

【中文标题】cpp 文件中的 C++ 变量能否定义为特殊符号 β【英文标题】:Can C++ variables in cpp file defined as Special Symbols β 【发布时间】:2018-10-01 07:27:39 【问题描述】:

我们能否在c++/c中使用特殊字符定义变量,例如; 双倍ε,µ,β,ϰ;

如果是,如何实现?

【问题讨论】:

完整答案在这里:en.cppreference.com/w/cpp/language/identifiers 您可以使用宏将它们定义为其他东西。例如,#define β beta,然后使用β 作为标识符的名称。我不会推荐它。 没有 C/C++ 这样的东西。这是两种不同的语言,有着不同的规则。 Pleaae 决定您要使用哪种语言并相应地更新您的标签。 尝试使用编译选项-fextended-identifiers。欲了解更多信息,请在此处查看答案:https://***.com/questions/32799078/why-doesnt-these-unicode-variable-names-work-with-fextended-identifiershttps://***.com/questions/12692067/and-other-unicode-characters-in-identifiers-not-allowed-by-g @***er:错误的编译器 - 这是标记为 Visual C++ 【参考方案1】:

根据CPP标准工作草案(N4713),

5.10 标识符 [lex.name] ... 标识符是任意长的字母和数字序列。标识符中的每个通用字符名应指定一个字符,其在 ISO 10646 中的编码属于表 2 中指定的范围之一。初始元素不应是通用字符名,指定其编码属于进入表 3 中指定的范围之一。

当我们查看表 3 时:

表 3 - 最初不允许使用的字符范围(组合字符)

0300-036F 1DC0-1DFF 20D0-20FF FE20-FE2F

您提到的符号是希腊字母,范围从U+0370U+03FF,扩展的希腊字母集范围从U+1F0xU+1FFx,根据wikipedia。这两个范围都允许作为标识符的初始元素。

请注意,并非所有编译器都对此提供支持。

带有 -std=c++17 选项的 GCC 8.2 无法编译。 但是,带有 -std=c++17 选项的 Clang 7.0 可以编译。

Live Demo for both GCC and Clang

【讨论】:

允许任何不在这些范围内的字符? U+0370U+03FF 不在您引用的范围内(0300-036F 刚刚结束)。 排除0300-036F 是有道理的。这些是组合字符/变音符号,例如 à 中的 `。根据 Unicode 标准,组合标记应跟随它们修改的字符,这在逻辑上将它们排除在任何其他 unicode 字符串的开头,而不仅仅是 C++ 标识符。【参考方案2】:

由于问题被标记为 Visual Studio:只需按照您的预期编写代码即可。

double β = 0.1;

当您保存文件时,Visual Studio 会警告您需要将文件保存为 Unicode。接受它,它就起作用了。 AFAICT,这也适用于 C 模式,即使 Visual Studio 不支持大多数其他 C99 扩展。

但是,从 g++ 8.2 开始,g++ 仍然不支持直接在标识符中使用的非 ASCII 字符,因此代码实际上是不可移植的。

【讨论】:

【参考方案3】:

是的,您可以使用特殊字符,但不能全部使用。您可以在下面的链接中找到允许的。

您可以在Identifiers - cppreference.com页面上找到有关如何构建标识符(带有unicode授权字符列表)的详细说明。

标识符是,引用,

任意长的数字序列、下划线、小写和大写拉丁字母以及大多数 Unicode 字符(详见下文)。有效标识符必须以非数字字符(拉丁字母、下划线或 Unicode 非数字字符)开头。标识符区分大小写(小写和大写字母不同),每个字符都有意义。

此外,Unicode 字符需要转义。

【讨论】:

以上是关于cpp 文件中的 C++ 变量能否定义为特殊符号 β的主要内容,如果未能解决你的问题,请参考以下文章

C++找到一个或多个多重定义的符号

c++中关于私有静态变量的问题

请问C++中啥是函数的定义性声明和函数的引用性声明,有啥区别

stdafx.cpp 中的变量定义

JAVA 去掉变量中的特殊符号

C++ 中的普通常量变量