问题标签 [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.
c - 检查 C 预处理器列表中是否存在条目
是否可以检查 X-macro 定义的列表中是否存在条目?鉴于下面的示例代码,我希望#if defined(GEORGE)
条件为真。
编辑:当然,不做明确#define GEORGE
的。我希望有一种方法来检查列表中的条目(在预处理器中),我只想在列表中进行声明。这可能是不可能的,但我想我问。
谢谢!
输出
c - 使 x 宏与 do while 0 一起工作
我试图让 x 宏与 do while 0 一起工作,因为checkpatch.pl对此不满意。然而,它打破了逻辑。想知道是否有人有任何建议让它发挥作用?
c - 在 x 宏定义中使用宏作为参数
考虑以下用户样式的x-macro:
func
我们可以使用它用前三个素数重复调用传入的宏。例如:
将声明返回 void 的函数foo2()
,foo3()
和foo5()
.
到目前为止,一切都很好。现在假设我想在 x-macro 本身的定义中使用一个宏作为参数,如下所示:
它不起作用,因为MAKE_FUNC
现在将尝试声明void fooMAX_PRIME()
,因为(我想)令牌连接发生而不扩展MAX_PRIME
。
我可以解决这个问题,让它foo5()
像以前一样声明吗?
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)
(并且它不使用它)。
我想不出一种方法来完成这项工作。
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 代码一起使用。
我的结论是正确的,还是我缺少一些规则?
c - C - 如何在我的宏中赋值?
我试图在我的 x 宏中分配一个值,但我真的不明白为什么它不起作用:
编译时出现以下错误:
有人可以解释为什么我会收到这个错误以及如何解决这个问题吗?
c - 使用宏转换结构中整数字段的字节序
考虑以下结构和函数
对于许多具有许多字段的结构,上面的代码编写起来很乏味。我想配置一次结构的名称和字段,并拥有为我生成的struct_name_hton
功能struct_name_ntoh
。我曾尝试使用 x 宏,但运气不好。一个可移植的 C 预处理器解决方案将受到高度赞赏(不是 C++)。
c++ - 将宏名称传递给 X-Macro 列表是否合法
我突然想到,以下是X 宏技巧的一种更可取的风格:
具体来说,将X
宏传递给列表,而不是在每次实例化列表时取消定义和重新定义它。这允许:
但问题是我不经常在野外看到这个成语,而且它不是维基百科所描述的,尽管每当我尝试它并且感觉更方便时它“似乎工作”。
我的问题是,这实际上是合法的和完全定义的,还是我依赖未定义的行为?
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>