gpt4 book ai didi

c++ - 将点作为参数传递给 C 宏

转载 作者:行者123 更新时间:2023-11-30 04:41:14 25 4
gpt4 key购买 nike

我在 StackOverflow 上阅读了不同的相关答案,但没有一个能给我这个问题的答案。我需要连接传递给宏的实体(不一定是字符串),它们之间有一个分隔符(在我的例子中是点)。这是我的代码:

    #define STR(x) #x
#define XSTR(x) STR(x)

#define CONC_(a, b) a ## b
#define CONC(a, b) CONC_(a, b)

#define CONC3(_1, _2, _3, S) CONC2(CONC2(_1, _2, S), _3, S)
#define CONC2(_1, _2, S) CONC(_1, CONC(S, _2))

#define JOIN_UNDERSCORE(_1, _2, _3) XSTR(CONC3(_1, _2, _3, _))
#define JOIN_DOT(_1, _2, _3) XSTR(CONC3(_1, _2, _3, .)) // here I pass dot

这里是你如何使用它

    std::string underscore = JOIN_UNDERSCORE(one, two, three);
std::string dot = JOIN_DOT(one, two, three); // this one doesn't compile

我可以使用另一种技术来实现这一点。喜欢:

    #define APPEND_DOT(x) "." STR(x)

#define CONCSTR3(_1, _2, _3) CONCSTR2(_1, _2) APPEND_DOT(_3)
#define CONCSTR2(_1, _2) STR(_1) APPEND_DOT(_2)
#define CONCSTR1(_1) STR(_1)

#define JOIN_STR_DOT(_1, _2, _3) CONCSTR3(_1, _2, _3)

std::string dot_str = JOIN_STR_DOT(one, two, three);

这将适用于点。但问题是如何通过分隔符使其通用。

这里有一个链接可以玩 https://godbolt.org/z/MDxsJS

最佳答案

## 运算符的结果必须是有效的预处理器标记。 one_ 有效,one. 无效。这就是下划线有效但点无效的原因。

如果打算创建一个字符串,您可以使用预处理器字符串文字连接而不是标记粘贴运算符:

#define STR(x) #x
#define JOIN_UNDERSCORE(_1, _2, _3) STR(_1) "_" STR(_2) "_" STR(_3)

一般可以写成:

#define STR(x) #x
#define JOIN_SYMBOL(_1, _2, _3, symbol) STR(_1) STR(symbol) STR(_2) STR(symbol) STR(_3)
...
const char* underscore = JOIN_SYMBOL(one, two, three, _);
const char* dot = JOIN_SYMBOL(one, two, three, .);

这不能用于创建变量名,但是点也不能用于创建变量名。

可以通过完全跳过连接来做到这一点,但我不知道这样做有什么好处:

#define DUMB_THING(_1, _2, _3, thingie) _1 thingie _2 thingie _3

#include <stdio.h>

int main (void)
{
typedef struct { int idea; } stupid_t;
typedef struct { stupid_t stupid; } really_t;
really_t really;
DUMB_THING(really, stupid, idea, .) = 42;
printf("%d", really.stupid.idea);
}

关于c++ - 将点作为参数传递给 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59157172/

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