首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C预处理器中生成唯一的值?

如何在C预处理器中生成唯一的值?
EN

Stack Overflow用户
提问于 2018-04-08 05:14:00
回答 2查看 0关注 0票数 0

我正在编写一堆相关的预处理宏,其中一个宏生成标签,而另一个宏则跳转到其中。我用这种方式:

代码语言:txt
复制
MAKE_FUNNY_JUMPING_LOOP(
  MAKE_LABEL();
  MAKE_LABEL();
)

我需要一些方法来生成唯一的标签,每个内部都有一个标签。预处理器调用MAKE_LABEL。我试过使用__LINE__但既然我调用MAKE_LABEL在另一个宏中,它们都有相同的行,标签会发生冲突。

我想把它扩展到这样的情况:

代码语言:txt
复制
MAKE_FUNNY_JUMPING_LOOP(
  my_cool_label_1:  // from first inner macro
  ...
  my_cool_label_2:  // from second inner macro
  ...
)

是否有一种方法来生成哈希或自动递增整数与预处理器?

EN

回答 2

Stack Overflow用户

发布于 2018-04-08 13:20:29

正如其他人指出的那样,__COUNTER__是一种简单但不标准的方法。

以下头文件将输出一个唯一的标签,无论它包含在哪里。

代码语言:txt
复制
#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)):

样本:

代码语言:txt
复制
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;
}

预处理到

代码语言:txt
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-08 15:08:14

如果使用gcc或msvc,则有__counter__。

比如:

代码语言:txt
复制
#ifndef USED_1
#define USED_1
1
#else
#ifndef USED_2
#define USED_2
2
/* many many more */
#endif
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档