问题标签 [x-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
100 浏览

c - 检查 C 预处理器列表中是否存在条目

是否可以检查 X-macro 定义的列表中是否存在条目?鉴于下面的示例代码,我希望#if defined(GEORGE)条件为真。

编辑:当然,不做明确#define GEORGE的。我希望有一种方法来检查列表中的条目(在预处理器中),我只想在列表中进行声明。这可能是不可能的,但我想我问。

谢谢!

输出

0 投票
1 回答
83 浏览

c - 使 x 宏与 do while 0 一起工作

我试图让 x 宏与 do while 0 一起工作,因为checkpatch.pl对此不满意。然而,它打破了逻辑。想知道是否有人有任何建议让它发挥作用?

0 投票
2 回答
473 浏览

c - 在 x 宏定义中使用宏作为参数

考虑以下用户样式的x-macro

func我们可以使用它用前三个素数重复调用传入的宏。例如:

将声明返回 void 的函数foo2(),foo3()foo5().

到目前为止,一切都很好。现在假设我想在 x-macro 本身的定义中使用一个宏作为参数,如下所示:

它不起作用,因为MAKE_FUNC现在将尝试声明void fooMAX_PRIME(),因为(我想)令牌连接发生而不扩展MAX_PRIME

我可以解决这个问题,让它foo5()像以前一样声明吗?

0 投票
4 回答
127 浏览

c - 从现有的 x 宏创建相关的 x 宏

考虑以下用户样式的x-macro

func我们可以用它来用前四个素数重复扩展传入的宏。例如:

将声明返回 void 的函数foo2()foo3()和 。foo5()foo7()

到目前为止,一切都很好。

假设我知道想要创建一个相关的 x 宏,它调用它的参数不是使用裸素数2, 3, ... 而是使用从它派生的一些标记,例如上面的函数名称。也就是说,我想要这个:

但实际上并没有把它全部写出来(事实上,它会随着时刻的PRIMES_X变化而失去同步。

我想要的是一种PRIMES_FOO_X根据PRIMES_X. 我几乎可以到达那里,例如:

在这种情况下,PRIMES_FOO_X扩展为:

...看起来不错,但是func这里不是传递的参数,而只是简单的标记,func因为FOO_ADAPT没有称为 的参数func,只有PRIMES_FOO_X(func)(并且它不使用它)。

我想不出一种方法来完成这项工作。

0 投票
2 回答
888 浏览

c - Misra-C 与 X 宏兼容吗?

可以说,在许多情况下,X 宏会增加安全性,因为它可以更容易地确保生成的数组的长度相同。


但是,Misra C(来自 2004 参考)规则似乎有很多限制使用的预处理器规则:

规则 19.1(建议)文件中的#include 语句只能在其他预处理器指令或注释之前。

例如,如果源表在包含以生成数组的其他文件中,则很麻烦。但这是建议性规则,因此可以解决。

规则 19.4(必需)C 宏只能扩展为花括号初始值设定项、常量、字符串文字、带括号的表达式、类型限定符、存储类说明符或 do-while-zero 构造。

应该不是问题,因为大多数 X 宏都用于生成数组初始值设定项或常量。

规则 19.6(必需)不得使用#undef。

使某些 X 宏使用模式成为不可能。不幸的是,但并没有完全阻止 X 宏。

规则 19.7(建议) 应优先使用函数而不是类似函数的宏。

仅限咨询规则。

规则 19.12(必需) 在单个宏定义中最多应出现一次 # 或 ## 预处理器运算符。

可以使用嵌套宏来解决。

规则 19.13(建议) 不应使用 # 和 ## 预处理器运算符。

例如,在生成枚举时很麻烦,但这只是建议性规则。

规则 19.15(必需) 应采取预防措施以防止头文件的内容被包含两次。

在某些情况下很麻烦,但可以解决。


看了上面的内容,如果你小心的话,似乎可以将 X-macros 与 Misra C 代码一起使用。

我的结论是正确的,还是我缺少一些规则?

0 投票
1 回答
46 浏览

c - 在 X-Macro 中打印数组元素时出现编译错误

我在使用 x-macro 的地方有以下代码:

和一个打印值的函数:

和主要功能:

不知道为什么,但在编译时,我收到以下错误: 在此处输入图像描述

如果编译器无法看到arr1arr2,我可以在预处理器文件中看到两者。以下是预处理器的输出:

知道我在做什么错吗?

0 投票
3 回答
2580 浏览

c - C - 如何在我的宏中赋值?

我试图在我的 x 宏中分配一个值,但我真的不明白为什么它不起作用:

编译时出现以下错误:

有人可以解释为什么我会收到这个错误以及如何解决这个问题吗?

0 投票
4 回答
431 浏览

c - 使用宏转换结构中整数字段的字节序

考虑以下结构和函数

对于许多具有许多字段的结构,上面的代码编写起来很乏味。我想配置一次结构的名称和字段,并拥有为我生成的struct_name_hton功能struct_name_ntoh。我曾尝试使用 x 宏,但运气不好。一个可移植的 C 预处理器解决方案将受到高度赞赏(不是 C++)。

0 投票
1 回答
120 浏览

c++ - 将宏名称传递给 X-Macro 列表是否合法

我突然想到,以下是X 宏技巧的一种更可取的风格:

具体来说,将X宏传递给列表,而不是在每次实例化列表时取消定义和重新定义它。这允许:

但问题是我不经常在野外看到这个成语,而且它不是维基百科所描述的,尽管每当我尝试它并且感觉更方便时它“似乎工作”。

我的问题是,这实际上是合法的和完全定义的,还是我依赖​​未定义的行为?

0 投票
2 回答
479 浏览

c - 在另一个宏中展开 X 宏

我有一个使用 打印输出的函数,fprintf()它对格式字符串和参数都使用宏。由于有多个位置打印此信息,这允许在仅更改一个位置的同时扩展打印。

我想使用相同的数据生成不同的打印,但我希望它们使用 X 宏自动扩展在一起,但我无法编译它。我不希望每次添加要打印的内容时都需要编辑打印,或者将每个打印包装在丑陋#define的 s 中。

这个程序试图做我想做的事,但它没有编译:

(想法是 STUFF 打印一件事,在另一个地方我将使用称为 TABLE 的 X 宏的不同列执行 STUFF2)

我收到以下错误:

main.c:在函数'main'中:

main.c:7:5:警告:函数“X”的隐式声明 [-Wimplicit-function-declaration]

main.c:12:5: 注意:在宏 'TABLE' 的扩展中</p>

main.c:18:27:注意:在宏“STUFF”的扩展中</p>

main.c:8:5: 错误:在 'X' 之前需要 ')'</p>