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+0370
到U+03FF
,扩展的希腊字母集范围从U+1F0x
到U+1FFx
,根据wikipedia。这两个范围都允许作为标识符的初始元素。
请注意,并非所有编译器都对此提供支持。
带有 -std=c++17
选项的 GCC 8.2 无法编译。
但是,带有 -std=c++17
选项的 Clang 7.0 可以编译。
Live Demo for both GCC and Clang
【讨论】:
允许任何不在这些范围内的字符?U+0370
到 U+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++ 变量能否定义为特殊符号 β的主要内容,如果未能解决你的问题,请参考以下文章