相关疑难解决方法(0)

真实使用X-Macros

我刚学会了X-Macros.您看过X-Macros的实际用途?他们什么时候成为工作的合适工具?

c macros c-preprocessor x-macros

67
推荐指数
5
解决办法
2万
查看次数

如何使用C预处理器编写while循环?

我从教育/黑客的角度来问这个问题,(我真的不想这样编码).

是否可以仅使用C预处理程序指令实现while循环.我知道宏不能递归扩展,那么如何实现呢?

c while-loop c-preprocessor

66
推荐指数
7
解决办法
5万
查看次数

宏返回它在C中给出的参数数量?

是否可以编写一个返回其参数数量的C宏?

我想做的事情:

foo(1) -> 1
foo(cat, dog) -> 2
foo(red, green, blue) -> 3
Run Code Online (Sandbox Code Playgroud)

如果可以以这样的方式定义这个宏以便它与##一起工作,那就更好了

foo(1) -> bar1(1)
foo(cat, dog) -> bar2(cat, dog)
foo(red, green, blue) -> car3(red, green, blue)
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:我真的想要一个宏,而不是一个函数.使用功能的建议将被低估.

c c-preprocessor

22
推荐指数
3
解决办法
1万
查看次数

为什么序列迭代在 C 宏中起作用?

在写C宏的时候,有个技巧叫做“序列迭代”。它看起来像这样:

#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define FUNCTION(name) void name();
#define FUNCTION_TABLE(seq) CAT(FUNCTION_TABLE_1 seq, _END)
#define FUNCTION_TABLE_1(x) FUNCTION(x) FUNCTION_TABLE_2
#define FUNCTION_TABLE_2(x) FUNCTION(x) FUNCTION_TABLE_1
#define FUNCTION_TABLE_1_END
#define FUNCTION_TABLE_2_END

FUNCTION_TABLE((x) (y) (z) (e))
Run Code Online (Sandbox Code Playgroud)

序列,即 FUCTION_TABLE 的参数,将被一一处理。但是,据我所知,令牌不会在同一范围内扩展两次。因为它被“涂成蓝色”。当 FUNCTION_TABLE_2 展开时,宏 FUNCTION_TABLE_1 已经绘制好了。为什么还要扩容?

c c++ macros

5
推荐指数
1
解决办法
557
查看次数

C 预处理器:迭代地将宏扩展为逗号分隔的列表

在后C 预处理器递归宏中使用 Paul Fultz II 的解决方案,我想扩展无限数量的括号宏参数,例如

#define MY_CHAIN (alpha) (beta) (gamma)
Run Code Online (Sandbox Code Playgroud)

到一个逗号分隔的列表中,该列表可以传递给可变参数宏,例如

CHAIN_COMMA(MY_CHAIN) // alpha, beta, gamma
Run Code Online (Sandbox Code Playgroud)

在下面的示例中[alpha] [beta] [gamma],我可以扩展为大括号并使用我尝试过的所有内容分隔列表,但逗号除外alpha :: beta :: gamma

这是我的完整(编译)代码:

#include <iostream>
using namespace std;

// unrelated macro utilities
#define SEE(expression) cout << #expression ": " << STR(expression) << endl;
#define CMD(function, ...) function(__VA_ARGS__)
#define STR(s) CMD(STR_, s)
#define STR_(s) #s

// concatenation
#define CAT(x, y) CAT_(x, y)
#define CAT_(x,y) x ## y // error from CHAIN_COMMA: passed 4 …
Run Code Online (Sandbox Code Playgroud)

comma-operator c-preprocessor variadic-macros

5
推荐指数
1
解决办法
1200
查看次数