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说,这个短语有一个结尾,因为翻译到像我的母语这样的语言时有歧义,所以必须从结尾翻译(有点真正的逻辑“结尾”,有些人取而代之的是短语的结尾),这颠倒了短语的意思(自动翻译更糟)<代码>前面的
和其中的
是基础英语课程所不知道的单词。我很幸运能熟悉文学语言。而不是缩减版本。他们真的应该少用复合短语。分号和“没有其他预处理标记可用”即使对我来说也是个谜。