Python解析C++头文件

11 篇文章 0 订阅

本文主要讲述使用Python解析C++头文件,使用的python库叫robotpy-cppheaderparser,github地址是https://github.com/robotpy/robotpy-cppheaderparser


一 安装

使用下面命令进行安装,

pip install robotpy-cppheaderparser

二 使用

首先准备一个c++头文件,名字叫SampleClass.h

#ifndef _SAMPLE_CLASS_H_
#define _SAMPLE_CLASS_H_

#include <vector>
#include <string>
#include <stdio.h>

#define DEF_1 1
#define OS_NAME "Linux"

const int MyData1=100;
const int MyData2=200;

using namespace std;

typedef enum {
    AA,
    BB
} myEnum_t;


class SampleClass
{
public:

    typedef enum {
        CC,
        DD
    } myAnother_t;

    SampleClass();
    /*!
     * Method 1
     */
    string meth1();

    ///
    /// Method 2 description
    ///
    /// @param v1 Variable 1
    ///
    int meth2(int v1);

    /**
     * Method 3 description
     *
     * \param v1 Variable 1
     * \param v2 Variable 2
     */
    void meth3(const string & v1, vector<string> & v2);

    /**********************************
     * Method 4 description
     *
     * @return Return value
     *********************************/
    unsigned int meth4();
private:
    void * meth5(){return NULL};

    /// prop1 description
    string prop1;
    //! prop5 description
    int prop5;
};


namespace Alpha
{
    class AlphaClass
    {
    public:
        AlphaClass();

        void alphaMethod();

        string alphaString;
    };

    namespace Omega
    {
        class OmegaClass
        {
        public:
            OmegaClass();

            string omegaString;
        };
    };
}

int sampleFreeFunction(int i)
{
    return i + 1;
}

int anotherFreeFunction(void);


#endif

然后使用robotpy-cppheaderparser对这个头文件进行解析,

import CppHeaderParser


cppHeader = CppHeaderParser.CppHeader("SampleClass.h")

解析后的内容放到变量cppHeader里,下面就来看下如何获取头文件里的各种内容

1. 获取include的头文件名

print(cppHeader.includes)

打印如下,

2. 获取头文件中定义的类名

for classname in cppHeader.classes.keys():
	print(classname)

打印如下,

3. 获取类所属的namespace

print(cppHeader.classes['SampleClass']['namespace'])
print(cppHeader.classes['AlphaClass']['namespace'])
print(cppHeader.classes['OmegaClass']['namespace'])

打印如下,

由于SampleClass没有namespace,所以打印为空

4. 获取类里的public方法

for oneMethod in cppHeader.classes['SampleClass']['methods']['public']:
	for kv in oneMethod.items():
		print(kv[0], " : ", kv[1])

	print('---------------------\n')

一个方法会有许多相关属性,可以根据实际需要进行选择。

常规来说只需要函数名,函数参数和返回类型就可以了,对应的key分别为“name”,“parameters”,“rtnType”

for oneMethod in cppHeader.classes['SampleClass']['methods']['public']:
	print('name: ', oneMethod['name'])
	print('rtnType: ', oneMethod['rtnType'])
	print('parameters: ', end='')
	if len(oneMethod['parameters']):
		for oneParam in oneMethod['parameters']:
			print(oneParam['name'], oneParam['type'], end='; ')
	print('\n')

5. 获取类里的public变量

for oneProperty in cppHeader.classes['AlphaClass']['properties']['public']:
	print('name: ', oneProperty['name'])
	print('type: ', oneProperty['type'])
	# for kv in oneProperty.items():
	# 	print(kv[0], " : ", kv[1])

这里只挑了2个比较重要的属性name和type,打印如下,

6. 获取类里的private方法

for oneMethod in cppHeader.classes['SampleClass']['methods']['private']:
	for kv in oneMethod.items():
		print(kv[0], " : ", kv[1])

	print('---------------------\n')

7. 获取类里的private变量

for oneProperty in cppHeader.classes['SampleClass']['properties']['private']:
	print('name: ', oneProperty['name'])
	print('type: ', oneProperty['type'])
	# for kv in oneProperty.items():
	# 	print(kv[0], " : ", kv[1])

8. 获取头文件里定义的函数(类外定义的函数)

for func in cppHeader.functions:
	print('name: {}'.format(func['name']))
	print('rtnType: {}'.format(func['rtnType']))
	print('parameters: {}'.format(func['parameters']))
	print('\n')

9. 获取头文件里定义的宏定义

for define in cppHeader.defines:
	print(define) # 类型是str

10. 获取头文件里定义的enum

for oneEnum in cppHeader.enums:
	print(oneEnum)

11. 获取类里定义的enum

for oneEnum in cppHeader.classes['SampleClass']['enums']['public']:
	print(oneEnum)

注意,这个enum是定义在SampleClass的public区

12. 获取头文件里定义的变量

for oneVar in cppHeader.variables:
	print(oneVar)

13 总览

使用下面的命令对整个头文件的解析结果进行总览,结果会以json格式打印出来,

python -m CppHeaderParser.tojson ./SampleClass.h

总览的好处是可以根据需要进行查看,因为很多属性不是很清楚,总览看一下就很方便。

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值