gpt4 book ai didi

c++ - 在要连接的宏中扩展 C++ 宏

转载 作者:行者123 更新时间:2023-11-30 00:52:46 25 4
gpt4 key购买 nike

我要让CS同学修改一个群号,然后生成一些和这个群号相关的东西。我不希望学生修改太多,但只希望在某处定义的一组编号为

#define GROUP_NUM 0

但是,我找不到从该 MACRO 生成其余部分的方法。例如:

#include <iostream>
using namespace std;

// string troubles
#define STR(x) #x
#define XSTR(x) STR(x)

// the trouble
#define GROUP_NUM 0
#define CLASS_NAME Group GROUP_NUM
#define CLASS_STR XSTR(CLASS_NAME)

int main()
{
cout << "CLASS_NAME = " << CLASS_STR << endl;

return 0;
}

悲哀地输出

CLASS_NAME = Group 0

这里的问题是我不想在 Group0 之间留出空间,因为我需要使用 CLASS_NAME 从中创建一些类,例如

class CLASS_NAME : public .... { ... }

我试过

#define CLASS_NAME Group##GROUP_NUM

但是 GROUP_NUM 没有得到扩展并输出

CLASS_NAME = GroupGROUP_NUM

我找到的唯一解决方案是将这些 CLASS_NAME 和 CLASS_STR 定义为将组号作为参数传递的宏函数(在调用站点上,而不是在另一个宏中!):

// the trouble
#define GROUP_NUM 0
#define CLASS_NAME(g) Group ## g
#define CLASS_STR(g) XSTR(CLASS_NAME(g))

int main()
{
cout << "CLASS_NAME = " << CLASS_STR(GROUP_NUM) << endl;

return 0;
}

有更好的解决方案吗?为什么以下内容没有展开?

#define CLASS_STR XSTR(CLASS_NAME(GROUP_NUM))

上面XSTR的定义似乎表明可以使用链式宏,所以我不明白为什么这里没有展开。

更新:辅助宏函数的技巧就是解决方案。但是我想澄清解决方案:

  1. 宏扩展技巧是如何工作的?是直接全面扩张还是只做一轮扩张? (也就是说,如果我有叠层宏,是否意味着我需要不止一层的辅助函数?)
  2. ##的扩展对我来说还是有点神秘

我的全部问题都涉及 nori 框架,尤其是 this .使用该宏,即

#define NORI_REGISTER_CLASS(cls, name) \
cls *cls ##_create(const PropertyList &list) { \
return new cls(list); \
} \
static struct cls ##_{ \
cls ##_() { \
NoriObjectFactory::registerClass(name, cls ##_create); \
} \
} cls ##__;

如果我使用 NORI_REGISTER_CLASS(CLASS_NAME, "mystring"),它会被错误地部分扩展为

Group0 * CLASS_NAME_create (const PropertyList &list) { return new Group0 (list); } ...

但是如果我使用一个包装器宏来调用那个,它就可以工作。这里宏展开的规律是什么?为什么第一个 cls 得到扩展而第二个保留名称?

最佳答案

一个可能的解决方案是:

#include <iostream>

using namespace std;

#define CLASS_NUM 0

// String macros
#define XSTR(x) STR(x)
#define STR(x) #x

#define CONCAT(x,y) x##y
// XCONCAT will first process tokens before passing them to CONCAT
#define XCONCAT(x,y) CONCAT(x,y)

// This will generate Group0
#define CLASS_NAME XCONCAT(Group,CLASS_NUM)

// Then this will generate "Group0"
#define CLASS_STR XSTR(CLASS_NAME)

int main()
{
cout << "CLASS_NAME = " << CLASS_STR << endl;

return 0;
}

使用此代码,输出为:

CLASS_NAME = Group0

关于c++ - 在要连接的宏中扩展 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com