Notez qu'il y avait un exemple particulier que «je veux partager des constantes entre Python et C ++, je veux corriger les constantes côté C ++ au moment de la compilation, et je veux utiliser les mêmes variables en Python».
Défini en .h depuis Python
sample.h
#ifndef _PARAM
#define _PARAM
#define NUM 10
#define epoch 100
#endif
Sortez une constante comme celle-ci. Cette fois, je ne considérerai pas les variables globales définies par const int
etc. car il est difficile de les classer.
def read_header_and_get_macro(header_filepath):
with open(header_filepath, mode='r') as f:
lst = [s.strip() for s in f.readlines()]
comment_flg = False
for l in lst:
items = l.split()
if len(items) != 0 and items[0] == "/*":
comment_flg = True
continue
if comment_flg == True:
if len(items) != 0 and items[0] == "*/":
comment_flg = False
continue
if len(items) < 2 or items[0] != "#define":
continue
if items[1] in globals():
if items[2] == 'true':
globals()[items[1]] = True
elif items[2] == 'false':
globals()[items[1]] = False
else:
try:
globals()[items[1]] = float(items[2])
except ValueError:
try:
globals()[items[1]] = int(items[2])
except ValueError:
globals()[items[1]] = items[2]
3e ligne
lst = [s.strip() for s in f.readlines()]
Lisez le fichier et listez-le ligne par ligne. Cette fois, j'ai pris une liste pour chaque ligne et l'ai tournée dans une liste, mais je suis libre de tourner f.readline ()
pour une déclaration séparément
4ème ligne
comment_flg = False
En C (++), tout ce qui va de / *
à la fin avec * /
est un commentaire, donc un drapeau pour s'en souvenir.
6ème ligne
items = l.split()
Obtenez une liste du contenu de la ligne, qui est divisée par des espaces demi-largeur.
['#define', 'NUM', '10']
Je voulais une liste comme celle-ci.
7ème ligne~13e ligne
if len(items) != 0 and items[0] == "/*":
comment_flg = True
continue
if comment_flg == True:
if len(items) != 0 and items[0] == "*/":
comment_flg = False
continue
Comme mentionné ci-dessus, les commentaires sont exclus.
14ème ligne~Ligne 15
if len(items) < 2 or items[0] != "#define":
continue
Les lignes qui ne commencent pas par «# define» sont exclues car aucune macro n'est définie.
16e ligne~Ligne 28
if items[1] in globals():
if items[2] == 'true':
globals()[items[1]] = True
elif items[2] == 'false':
globals()[items[1]] = False
else:
try:
globals()[items[1]] = float(items[2])
except ValueError:
try:
globals()[items[1]] = int(items[2])
except ValueError:
globals()[items[1]] = items[2]
Autres que les précédents devraient être des constantes. A ce moment, ʻitems [1] doit contenir un nom constant, donc ʻitems [1] dans globals ()
est utilisé pour vérifier si cela est défini comme une variable globale. Si elle est définie, vous pouvez trouver sa valeur avec globals () [items [1]]
, donc si vous réécrivez de force la variable, elle sera complétée. Cependant, nous travaillons pour aligner le type booléen de C ++ sur Python, et nous convertissons également float / int / str.
Recommended Posts