【发布时间】:2021-04-04 18:44:52
【问题描述】:
我想重复一段 C 代码 N 次,每次只更改几个单词(如变量名、变量类型...)。
我想获得类似于 NumPy 的 .src 文件预处理器的最终效果。例如在their code 你可以看到:
/**begin repeat
* #name = number, integer, signedinteger, unsignedinteger, inexact,
* floating, complexfloating, flexible, character#
* #NAME = Number, Integer, SignedInteger, UnsignedInteger, Inexact,
* Floating, ComplexFloating, Flexible, Character#
*/
NPY_NO_EXPORT PyTypeObject Py@NAME@ArrType_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "numpy.@name@",
.tp_basicsize = sizeof(PyObject)
};
/**end repeat**/
会变成这样的:
NPY_NO_EXPORT PyTypeObject PyNumberArrType_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "numpy.number",
.tp_basicsize = sizeof(PyObject)
};
NPY_NO_EXPORT PyTypeObject PyIntegerArrType_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "numpy.integer",
.tp_basicsize = sizeof(PyObject)
};
NPY_NO_EXPORT PyTypeObject PySignedIntegerArrType_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "numpy.signedinteger",
.tp_basicsize = sizeof(PyObject)
};
// And so on for all the couples of `name` and `NAME`.
有没有办法做同样的事情,但不必使用外部预处理器?我考虑过使用宏,但我不这么认为。
【问题讨论】:
-
“琐碎”的解决方案是创建一个模板,填写更改的内容,然后生成源代码。
-
@DaveN ...我认为这基本上是 Numpy 所做的,并且显然不合适,因为它“太老套了”。 (但我不确定我是否看到任何其他选项不是很大程度上的变化)
-
"有没有办法解决我的问题" 您需要解决的问题究竟是什么是?您是否知道 Python 附带了各种工具来交互/使用原始 c 数据,例如
ctypes、struct和array?您是否了解用于简化编写 C 扩展/包装器的工具,例如 Cython? -
如果我正确理解了您的问题,归结为“如何在 C 中为多种类型重复代码”。它似乎并不特定于 Python C API,甚至不是 Python 本身。您是否考虑过 C 宏或 C++ 模板?
-
第一:只问1个问题。 PS 在您的帖子中提出提出问题所需的内容。不要提供链接并期望我们阅读它们或知道哪些位是相关的或它们是如何相关的。你应该这样做并从中形成你的问题。 PS您甚至从未说过“为C固定数据类型创建包装器”的确切含义。 PS请通过编辑而不是cmets进行澄清。 PS 诸如“相当于”之类的东西没有帮助。你没有清楚地说什么是(不是)一个例子。
标签: c