C++中的$符号
Posted
技术标签:
【中文标题】C++中的$符号【英文标题】:$ symbol in c++ 【发布时间】:2013-01-30 01:41:25 【问题描述】:我从一个开源库中阅读了以下代码。令我困惑的是美元符号的使用。任何人都可以澄清代码中 $ 的含义。非常感谢您的帮助!
__forceinline MutexActive( void ) : $lock(LOCK_IS_FREE)
void lock ( void );
__forceinline void unlock( void )
__memory_barrier(); // compiler must not schedule loads and stores around this point
$lock = LOCK_IS_FREE;
protected:
enum $ LOCK_IS_FREE = 0, LOCK_IS_TAKEN = 1 ;
Atomic $lock;
【问题讨论】:
这不是标准的 C++ 吗?我很确定您不能在任何标识符名称中包含特殊字符。 什么编译器/工具链? @Rapptz,armcc
(至少)允许 $
在标识符中。 clang
也是如此,在这里进行测试。
太糟糕了。比起std::put/get_money
,我更喜欢std::put$
和std::get$
的戒指。
@Code-Guru-C++ 标准不允许在标识符名称中使用 $。
【参考方案1】:
它被用作标识符的一部分。
[C++11: 2.11/1]
将标识符定义为“任意长的字母和数字序列”。它在上面给出的语法中定义了“字母和数字”,它只明确命名数字、小写和大写罗马字母以及下划线字符,但也允许“其他实现定义的字符”,其中大概是一个。
在这种情况下,$
除了作为标识符的一部分(在本例中为变量名)之外没有特殊含义。位于变量名的开始并没有什么特别的意义。
【讨论】:
并且 OP 正在谈论的代码来自code.google.com/p/point-frag,以防有人感兴趣。作者在 CMakeLists.txt 中使用了-std=c++0x
标志。所以你是对的。 +1
假设 $ 符号映射为引号。那会发生什么?【参考方案2】:
有一个 gcc 开关 -fdollars-in-identifiers
明确允许在标识符中使用 $。
也许他们启用它并将 $ 用作不太可能与正常名称冲突的东西。
-fdollars-in-identifiers
在标识符中接受 $。您还可以通过选项 -fno-dollars-in-identifiers 明确禁止使用 $。 (GNU C 允许 $ 通过 大多数目标系统的默认设置,但也有一些例外。) 传统 C 允许字符 $ 构成标识符的一部分。 但是,ISO C 和 C++ 禁止在标识符中使用 $。
见the gcc documentation。希望链接保持良好。
【讨论】:
您通过引用相关段落和所有必要信息做了绝对正确的事情,因此如果文档确实死了,它不会太重要......但仍然包括链接,以便信息作为主要来源仍然具有权威性。干得好! @Non-StopTimeTravel 谢谢。 这个项目(embree)来自 Intel,他们在 Linux、Mac 和 Windows 系统上使用 Intel 编译器、gcc 和 Microsoft Compiler 进行了测试。所以 gcc 似乎支持美元符号【参考方案3】:即使美元符号根据标准不是有效的标识符,也可以被接受。例如visual studio(我也认为ggc,但我不确定)似乎接受它。
查看此文档:http://msdn.microsoft.com/en-us/library/565w213d(v=vs.80).aspx 还有这个:Are dollar-signs allowed in identifiers in C++03?
【讨论】:
我可以确认这一点,因为我在 VS2008 中打开源代码并且它可以编译,因为这个项目(embree)来自英特尔,他们在 Linux 上的英特尔编译器、gcc 和 Microsoft 编译器中进行了测试, Mac 和 Windows 系统。我想说这三个编译器现在都支持 $ 符号作为标识符的一部分【参考方案4】:C++ 标准说:
基本源字符集由 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 _ [ ] # ( ) % : ; . ? * + - / ^ & | ! = , \" '
上述基本源字符集中没有$;代码中的 $ 字符是对基本源字符集的扩展,这不是必需的。考虑在英国,使用英镑符号(£ 或 ₤)代替美元符号 ($)。
【讨论】:
FWIW,C++ 在标识符中允许的字符远不止这些字符。 @R.MartinhoFernandes 一个有效的 C++ 实现不需要在解析源代码时容忍除上面指定的字符之外的任何字符。 这一切都无关紧要。讨论标识符的部分是 §2.11。 “考虑在英国,英镑符号(£ 或 ₤)用于代替美元符号 ($)。”这里的逻辑令人震惊。 @modifiablelvalue 人们正在努力提供帮助。你骂他们?那你来这里干什么?以上是关于C++中的$符号的主要内容,如果未能解决你的问题,请参考以下文章
与静态库中的 std::string 相关的 C++ 未定义符号