Je génère un code C basé sur les informations fournies par un autre fichier (un fichier XML). Certains morceaux de C sont inclus dans ce fichier XML et doivent être inclus textuellement dans mon fichier C généré. Je souhaite utiliser la directive #line, de sorte que si ces segments contiennent une erreur, l'utilisateur verra le numéro de ligne dans le fichier XML d'origine du bloc. Par exemple, je souhaite générer du code comme:Y at-il un moyen de "défaire" l'effet de #line en C?
int main() {
#line 35 "file.xml"
....
#line
}
Je veux en quelque sorte « fermer » la section #line, je veux dire que je pense que s'il y a une erreur par exemple avec la fermeture} et qui est généré par mon programme, l'utilisateur devrait pas voir "erreur sur la ligne 36 de fichier.xml", qui sera sans signification pour eux et les confondre. Par exemple, je pourrais imaginer une directive #line en elle-même (comme dans mon exemple) ferait quelque chose comme ça. Mais cela ne fonctionne pas, et il n'y a aucune mention d'une telle installation dans le gcc docs on #line.
Y a-t-il une telle installation qui me manque? Ou est-ce que je demande juste quelque chose qui n'existe pas? Comment iriez-vous sur un tel problème?
Merci pour votre réponse! Je pensais à ça aussi. Mais cela m'obligerait à connaître le numéro de ligne auquel je suis habitué dans le fichier que je suis en train de générer. Possible, mais sûrement, je pense, le compilateur C a déjà la logique intégrée pour produire des erreurs par rapport aux lignes dans le fichier C réel, car c'est ce qu'il ferait s'il n'y avait jamais eu de directives #line dans le fichier du tout. Il ne sert à rien de dupliquer des choses déjà intégrées dans le compilateur (sauf si je dois le faire?). De plus, j'écris simplement le fichier C généré dans un flux, donc ce n'est pas trivial de trouver le numéro de ligne actuel. –
Non - le pré-processeur C ne fournit pas ce mécanisme. Les ordinateurs sont bons à compter; faites-en (le générateur de code) faire le travail pour vous. –
Le préprocesseur C peut le faire pour vous --- si vous utilisez une directive '# include '. (Regardez la sortie pré-traitée pour voir toutes les directives #line générées.) –