本文主要讲述使用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
总览的好处是可以根据需要进行查看,因为很多属性不是很清楚,总览看一下就很方便。