Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 宏在c+中展开+;_C++_Macros - Fatal编程技术网

C++ 宏在c+中展开+;

C++ 宏在c+中展开+;,c++,macros,C++,Macros,定义两个宏,如下所示: #define MACRO_COMBINE_INNER(A,B) A##B #define MACRO_COMBINE(A,B) MACRO_COMBINE_INNER(A,B) 我们使用这些宏 MACRO_COMBINE_INNER(ABC,__LINE__) MACRO_COMBINE(ABC,__LINE__) 如果当前行号为123,即line==123,则从两个宏展开结果的原因如下: ABC__LINE__ ABC123 展开顺序在这里起作用,首先展开异常宏

定义两个宏,如下所示:

#define MACRO_COMBINE_INNER(A,B) A##B
#define MACRO_COMBINE(A,B) MACRO_COMBINE_INNER(A,B)
我们使用这些宏

MACRO_COMBINE_INNER(ABC,__LINE__)
MACRO_COMBINE(ABC,__LINE__)
如果当前行号为123,即line==123,则从两个宏展开结果的原因如下:

ABC__LINE__
ABC123

展开顺序在这里起作用,首先展开异常宏,然后展开内部宏。在第一种情况下,展开
MACRO\u COMBINE\u internal
后,您会得到:

  ABC##__LINE__
它会变成
ABC\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因为
\uuuuuuuuuuuuuuuuuuuuu。在第二种情况下,预处理器展开
宏组合(ABC,行)
,然后
\uuuu行
展开`

  MACRO_COMBINE_INNER(ABC,123)
然后展开
MACRO\u COMBINE\u INNER

  ABC##123
stringify操作符也有类似的行为,需要创建如下宏

#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)
要能够在字符串文字中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

#define THROW_BAD_INDEX(x) throw std::out_of_range \
                           (__FILE__ ":" STRING(__LINE__) ": Bad index")

具体说明原因。这是一个由C++标准定义的行为。N4713声明:“在被替换之前,每个参数的预处理标记都被完全宏替换,就像它们构成了预处理文件的其余部分一样;没有其他预处理标记可用。”因此,宏
\uuuuu LINE\uuuuuu
在传递给另一个宏之前必须先求值才能使用。@MaryChang正是这种说法让人感到困惑,因为除了数学家以外的任何人(或不是英语作为第一语言)我认为应该先把
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,“替换列表中的一个参数,除非前面有一个
预处理器标记,或者后面跟着一个
预处理器标记”。Standardese的部分确实很复杂,但“前面有”“这并不是一个晦涩难懂的术语。@hWalter说,这个短语有一个结尾,因为翻译到像我的母语这样的语言时有歧义,所以必须从结尾翻译(有点真正的逻辑“结尾”,有些人取而代之的是短语的结尾),这颠倒了短语的意思(自动翻译更糟)<代码>前面的
和其中的
是基础英语课程所不知道的单词。我很幸运能熟悉文学语言。而不是缩减版本。他们真的应该少用复合短语。分号和“没有其他预处理标记可用”即使对我来说也是个谜。