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++中的$符号的主要内容,如果未能解决你的问题,请参考以下文章

替换 C++ 字符串中的标点符号

与静态库中的 std::string 相关的 C++ 未定义符号

c++中的各种符号是啥意思?

C++ 中的 LPWSTR、wchar_t* 和无符号短指针

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

如何使用特定符号 C++ 查找和替换字符串中的所有字符