问题描述
我正在写一堆相关的预处理器宏,其中一个会生成标签,另一个会跳转到该标签.我以这种方式使用它们:
I'm writing a bunch of related preprocessor macros, one of which generates labels which the other one jumps to. I use them in this fashion:
MAKE_FUNNY_JUMPING_LOOP(
MAKE_LABEL();
MAKE_LABEL();
)
我需要某种方式来生成唯一标签,使用预处理器为每个内部MAKE_LABEL
调用一个标签.我尝试使用__LINE__
,但是由于我在另一个宏中调用了MAKE_LABEL
,因此它们都具有相同的行,并且标签会发生冲突.
I need some way to generate unique labels, one for each inner MAKE_LABEL
call, with the preprocessor. I've tried using __LINE__
, but since I call MAKE_LABEL
inside another macro, they all have the same line and the labels collide.
我希望将其扩展为以下内容:
What I'd like this to expand to is something like:
MAKE_FUNNY_JUMPING_LOOP(
my_cool_label_1: // from first inner macro
...
my_cool_label_2: // from second inner macro
...
)
是否可以使用预处理器生成哈希或自动递增整数?
推荐答案
如其他人所述,__COUNTER__
是执行此操作的简单但非标准的方法.
As others noted, __COUNTER__
is the easy but nonstandard way of doing this.
如果您需要额外的可移植性,或者需要其他出色的预处理器技巧,请 Boost预处理程序库(适用于C和C ++)将起作用.例如,以下头文件将在包含头文件的任何地方输出一个唯一的标签.
If you need extra portability, or for other cool preprocessor tricks, the Boost Preprocessor library (which works for C as well as C++) will work. For example, the following header file will output a unique label wherever it's included.
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/slot/slot.hpp>
#if !defined(UNIQUE_LABEL)
#define UNIQUE_LABEL
#define BOOST_PP_VALUE 1
#include BOOST_PP_ASSIGN_SLOT(1)
#undef BOOST_PP_VALUE
#else
#define BOOST_PP_VALUE BOOST_PP_INC(BOOST_PP_SLOT(1))
#include BOOST_PP_ASSIGN_SLOT(1)
#undef BOOST_PP_VALUE
#endif
BOOST_PP_CAT(my_cool_label_, BOOST_PP_SLOT(1)):
示例:
int main(int argc, char *argv[]) {
#include "unique_label.h"
printf("%x\n", 1234);
#include "unique_label.h"
printf("%x\n", 1234);
#include "unique_label.h"
return 0;
}
预处理为
int main(int argc, char *argv[]) {
my_cool_label_1:
printf("%x\n", 1234);
my_cool_label_2:
printf("%x\n", 1234);
my_cool_label_3:
return 0;
}
这篇关于如何在C预处理器中生成唯一值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!