c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?

没有

ctypes的早期版本附带了一个名为codegenerator的模块,该模块将解析头文件,以获取常量值并将原型转换为restype/argtypes声明。然而,据我所知,这是从来没有完成的,它是从包中删除之前,纳入stdlib。在

您可以深入研究the source并拉出常量内容,同时跳过更复杂的原型内容。在

然而,我通常的做法是编写自己的生成器。在

例如,在安装过程中运行此脚本:constants = {}

with open('foo.h') as infile:

for name, value in re.findall(r'#define\s+(\w+)\s+(.*)', infile):

try:

constants[name] = ast.literal_eval(value)

except Exception as e:

pass # maybe log something

with open('_foo_h.py', w) as outfile:

outfile.write(repr(constants))

那么foo.py就可以from _foo_h import *。在

为此编写一个完美的regexp非常困难,也许是不可能的;编写一个适用于给定项目中实际关心的头的regexp非常容易。事实上,通常你只需要上面的一个,或者跳过评论的那个。在

但有时这行不通。例如,头文件可能是#define FOO_SIZE 8对于64位构建,而{}对于32位构建。你怎么处理?在

为此,你要求编译器为你做这件事。大多数编译器都有一种方法来预处理一个文件,只要足够远就可以得到所有活动的定义。有些编译器甚至可以以一种很好的格式转储宏定义,而跳过其他所有内容。使用gcc和标志兼容的编译器,如clang,-E预处理,-dM转储宏。所以:

^{pr2}$

您可能需要传入一些额外的编译器标志来控制正确定义的内容,例如pkgconfig foo cflags的结果。在

这还将提供在foo.h(递归地)包含的任何内容中定义的宏,以及gcc的内置宏。你可能想要,也可能不想要。在the 69105 gcc flags中的某个地方,我相信有一些方法可以控制它,但我不记得它们了。在

请注意,这两种方法都不会得到常量变量或枚举,例如:static const int SPAM_SPAM_SPAM = 73;

enum {

kSPAM = 1,

kEGGS

};

解析变得更加困难;您可能希望使用真正的C99解析器,比如^{}-或者,您可能希望解析类似gccxml而不是{}的输出。但是即使这样也不能告诉你如果你不写一点逻辑kEGGS是2。在

如果你想处理C++,那就更糟糕了,用COSTEXPR和静态类成员和用户定义的文字……

或者…你必须使用ctypes?在

^{}提供了一种从Python调用C代码的不同方法,它使这一过程更加容易。在

^{}允许您编写几乎可以编译成C的Python代码,而C语言可以直接包含头文件。在

还有各种绑定生成器(例如SWIG)或绑定编写库(例如boost::python),它们可以使通过扩展模块将值导出到python更容易。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值