【发布时间】:2020-07-12 14:16:01
【问题描述】:
问题
我正在寻找一个可变参数 C 预处理器宏,它将其参数和相应的格式字符串传递给一个函数,根据参数的数量重复一个字符。
例如,我想要一个宏 FOO,它的扩展如下(或等效的 C 代码):
-
FOO(1)→bar("d",1) -
FOO(1,2)→bar("dd",1,2), -
FOO(1,2,3)→bar("ddd",1,2,3) - 奖励:
FOO()→bar("")
虽然我可以将C preprocessor macro for returning a string repeated a certain number of times 和C++ preprocessor __VA_ARGS__ number of arguments(或类似问题)的解决方案结合起来,或者使用variadic macros,但它们有几个缺点,例如:
- 需要特殊库,例如 Boost(这对我来说是个问题),
- 依赖于编译器,
- 仅在运行时工作,
- 极其复杂。
我希望,当这些问题不被分开考虑时,会出现一些更好的解决方案。
背景
我想在自动生成的代码中回调 Python 的 C 扩展中的 Python 函数。
因此,例如,我需要将foo(1,2,3) 扩展为:
PyObject_CallObject( callback_foo, Py_Build_Value("(Oddd)",Y,1,2,3) )
我知道foo 的所有参数都是双精度数,但我不知道它们的数量。
(上面的例子有些简化。我知道它缺少一些Py_DECREFs。)
【问题讨论】:
-
我认为没有任何可能避免“极其复杂”,特别是因为您无法依赖第三方包提供的宏堆栈(这只会 move 复杂性,无论如何,不会消除它)。 C 的宏处理器本身并非设计为一种编程语言,您提出的行为至少涉及两个难以处理的不同领域。为什么您的代码生成器不能自己处理生成完整的函数调用?
-
这很简单,只需在参数数量上重载宏...让重载返回
"d""dd""ddd"等。 -
这能回答你的问题吗? Overloading Macro on Number of Arguments
-
@KamilCuk:还不错,但还是有一些协同效应。我根据他们发布了一个答案。
-
@JohnBollinger:为什么您的代码生成器不能自己处理生成完整的函数调用? – 理论上可以,但由于原因,这将是一个很大的麻烦远远超出了这个问题的范围。
标签: c c-preprocessor python-c-api variadic-macros