Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++_Macros_C Preprocessor - Fatal编程技术网

C++ 在宏定义中使用线

C++ 在宏定义中使用线,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,在宏中,我希望生成一个具有不同名称的变量,并尝试使用\uuuuu LINE\uuuu作为区分它们的方法。简化示例: #define UNIQUE_INT int prefix##__LINE__ UNIQUE_INT; UNIQUE_INT; 但是,似乎\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 我认为\uuuuuuuuuuuuuuuuuuuu

在宏中,我希望生成一个具有不同名称的变量,并尝试使用
\uuuuu LINE\uuuu
作为区分它们的方法。简化示例:

#define UNIQUE_INT   int prefix##__LINE__

UNIQUE_INT;
UNIQUE_INT;
但是,似乎
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


我认为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>不能在宏定义中使用,就好像它扩展到了定义的行号而不是宏调用的行号一样,但让我问一下,以防有人有话要说。

问题是在预处理器中,
##
在展开
uu行uu
之前进行。如果添加另一层间接寻址,则可以获得所需的结果

出于技术原因,您实际上需要两个宏(有时,如果您在现有宏中使用此宏,您似乎不需要第二个宏):


问题是在预处理器中,
##
在展开
uuu行uu
之前发生。如果添加另一层间接寻址,则可以获得所需的结果

出于技术原因,您实际上需要两个宏(有时,如果您在现有宏中使用此宏,您似乎不需要第二个宏):


这看起来是个糟糕的主意。即使您确实根据行号创建了名称为的变量,您打算如何在以后的代码中引用这些变量?@squemishossifrage这不是一个糟糕的主意,一般来说,它可能非常有用。关键不在于您将再次引用变量,而在于您希望确保它是构造的,并且不会在函数的其余部分引用,因为会有一些副作用或调试。对于像这样的int,我想这是没有用的,但可能只是一个例子。是的,这个例子过于简单化了。正如@chrisbeck所说,有一个很好的答案。这看起来是个糟糕的主意。即使您确实根据行号创建了名称为的变量,您打算如何在以后的代码中引用这些变量?@squemishossifrage这不是一个糟糕的主意,一般来说,它可能非常有用。关键不在于您将再次引用变量,而在于您希望确保它是构造的,并且不会在函数的其余部分引用,因为会有一些副作用或调试。对于像这样的int,我想这是没有用的,但可能只是一个例子。是的,这个例子过于简单化了。正如@chrisbeck所说,有一个很好的答案,但它不起作用(GCC4.9.2)。它产生两行
int-prefix\uuuuu-LINE\uuuu。它不工作。无论是在gcc中还是在visualstudio中。相同的结果。很抱歉,第一个版本有一个错误,因为我从我现有的代码复制有点匆忙。您需要使用两个宏,而不仅仅是一个宏。事实上,我猜发布这个副本的人一开始也犯了同样的错误:。。。无论如何,在回答之前我应该检查一下副本。但它不起作用(gcc 4.9.2)。它产生两行
int-prefix\uuuuu-LINE\uuuu。它不工作。无论是在gcc中还是在visualstudio中。相同的结果。很抱歉,第一个版本有一个错误,因为我从我现有的代码复制有点匆忙。您需要使用两个宏,而不仅仅是一个宏。事实上,我猜发布这个副本的人一开始也犯了同样的错误:。。。无论如何,在回答之前,我应该检查一下副本。
#define TOKEN_PASTE(x, y) x##y
#define CAT(x,y) TOKEN_PASTE(x,y)
#define UNIQUE_INT \
  int CAT(prefix, __LINE__)

UNIQUE_INT;
UNIQUE_INT;