この記事では、主にPythonを使用してC ++ヘッダーファイルを解析する方法について説明します。使用されるPythonライブラリはrobotpy-cppheaderparserと呼ばれ、githubアドレスはhttps://github.com/robotpy/robotpy-cppheaderparserです。
1回のインストール
次のコマンドを使用してインストールします。
pip install robotpy-cppheaderparser
2回目の使用
まず、SampleClass.hという名前のc ++ヘッダーファイルを準備します
#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.インクルードのヘッダーファイル名を取得します
print(cppHeader.includes)
印刷は次のとおりです。
2.ヘッダーファイルで定義されているクラス名を取得します
for classname in cppHeader.classes.keys():
print(classname)
印刷は次のとおりです。
3.クラスが属する名前空間を取得します
print(cppHeader.classes['SampleClass']['namespace'])
print(cppHeader.classes['AlphaClass']['namespace'])
print(cppHeader.classes['OmegaClass']['namespace'])
印刷は次のとおりです。
SampleClassには名前空間がないため、印刷は空です
4.クラスでpublicメソッドを取得します
for oneMethod in cppHeader.classes['SampleClass']['methods']['public']:
for kv in oneMethod.items():
print(kv[0], " : ", kv[1])
print('---------------------\n')
メソッドには多くの関連属性があり、実際のニーズに応じて選択できます。
一般的には、関数名だけが必要で、関数のパラメーターと戻り値の型で十分です。対応するキーは、それぞれ「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.クラスでパブリック変数を取得します
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つの重要な属性の名前とタイプを選択し、次のように出力します。
6.クラスのプライベートメソッドを取得します
for oneMethod in cppHeader.classes['SampleClass']['methods']['private']:
for kv in oneMethod.items():
print(kv[0], " : ", kv[1])
print('---------------------\n')
7.クラス内のプライベート変数を取得します
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.ヘッダーファイルで定義されている列挙型を取得します
for oneEnum in cppHeader.enums:
print(oneEnum)
11.クラスで定義された列挙型を取得します
for oneEnum in cppHeader.classes['SampleClass']['enums']['public']:
print(oneEnum)
この列挙型はSampleClassのパブリックエリアで定義されていることに注意してください
12.ヘッダーファイルで定義されている変数を取得します
for oneVar in cppHeader.variables:
print(oneVar)