7

我可以在C++中使用以下内容吗?

#define $ cout

int main(){
    $<<"Hello World!\n";
    return 0;
}

我想知道它是否会引起任何冲突。

4

3 回答 3

12

这不是绝对合法的,但您的实现可以接受它。

考虑:

[C++11: 2.5/1]:每个被转换为标记 (2.7) 的预处理标记都应具有关键字、标识符、文字、运算符或标点符号的词汇形式。

在这里,你$显然不是关键字、运算符或标点符号(因为这些都在标准中枚举),而且它看起来不像文字,所以它只能是一个标识符;现在,标识符必须只包含字母数字和下划线,并且数字不能是前导(基于下面表示的语法[C++11: 2.11])。

但是,该标准还允许实现接受其他字符,因此您想做的事情可能会起作用,但它不会是可移植的。

于 2014-02-19T15:40:12.617 回答
5

这是实现定义的行为。不包含在标识符的语法中, C++$中标识符名称的规则是:

  1. 不能以数字开头
  2. 可以由字母、数字、下划线、通用字符名和实现定义的字符组成
  3. 不能是关键字

但它确实允许许多编译器作为扩展支持的实现定义的字符,包括gccVisual Studio

C++ 标准草案的2.11 Identifier部分涵盖了实际的语法:

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

我们可以define16 Preprocessing directives部分看到这适用于。从语法中我们可以看出它必须是一个标识符

# define identifier replacement-list new-line
# define identifier lparen identifier-listopt) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list, ... ) replacement-list new-line
         ^^^^^^^^^^
于 2014-02-19T15:41:28.537 回答
0

$一些允许在标识符中使用的编译器有一个有趣的情况。例如,至少 MS VC++ 2010 允许$在标识符中使用。

因此,例如,如果您定义

char $ = '$';

然后写了

#define $ std::cout
//...

$ << $;

然后您将在控制台输出数字 1 或某个整数中看到符号 $ 而不是符号。:)

于 2014-02-19T15:39:47.427 回答