我是靠谱客的博主 痴情汽车,最近开发中收集的这篇文章主要介绍c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

没有

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

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

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

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

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

for name, value in re.findall(r'#defines+(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更容易。在

最后

以上就是痴情汽车为你收集整理的c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?的全部内容,希望文章能够帮你解决c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部