Je travaille dans un environnement de ligne de commande Linux terminal, sans IDE. Je compile mes programmes C++ avec g ++. Celui-ci dépend de l'utilisation de macros en ligne de commande pour exécuter des instructions de code différentes sans changer le code source lui-même. Voici le morceau de code où j'ai un problème. J'ai plusieurs tableaux différents sur lesquels je veux effectuer un tri. Ensuite, j'ai des fonctions ailleurs dans le code source qui effectuent ce tri et retournent le tableau trié. Je veux utiliser des macros en ligne de commande pour dire au préprocesseur quel tableau je veux utiliser, et quel algorithme de tri utiliser (quelle fonction appeler). SORT_ALG
doit être remplacé par le nom de la fonction, et ARRAY
doit être remplacé par le nom du tableau. Ainsi, après traitement préalable, la ligne devrait ressembler à ceci:Le préprocesseur de macros de ligne de commande C++ ne remplace pas le mot
int* sorted_array = BubbleSort(array1, array1_size);
Voici le code source:
int array1[] = {24, 13, 9, 64, 7, 23, 34, 47};
int array1_size = sizeof(array1)/sizeof(array1[0]);
// an already sorted array!
int array2[] = {1, 2, 5, 8, 10, 15, 20, 25, 30};
int array2_size = sizeof(array2)/sizeof(array2[0]);
// a reverse sorted array!
int array3[] = {75, 50, 45, 30, 25, 18, 17, 12, 10, 6, 5};
int array3_size = sizeof(array3)/sizeof(array3[0]);
/*
* This code uses command line macros defined by g++
* SORT_ALG should be one of the sorting function names such as:
* BubbleSort
* BubbleSortOptimized
* ARRAY should be the name of one of the arrays, without the brackets:
* array1
* array2
* array3
* Example of compiling the program with g++ using command line macros:
* g++ -D SORT_ALG=BubbleSort -D ARRAY=array1 sorting.cpp
*/
int* sorted_array = SORT_ALG(ARRAY, ARRAY_size);
cout << "The sorted array: ";
PrintArray(sorted_array, ARRAY_size);
cout << endl;
Lorsque je tente de compiler le code source, le préprocesseur ne reconnaît pas remplacer ARRAY_size
avec la variable correspondante: array1_size
.
$ g++ -D SORT_ALG=BubbleSort -D ARRAY=array1 sorting.cpp
sorting.cpp: In function ‘int main()’:
sorting.cpp:139:39: error: ‘ARRAY_size’ was not declared in this scope
int* sorted_array = SORT_ALG(ARRAY, ARRAY_size);
Je pense que le préprocesseur devrait reconnaître l'ARRAY
étant array1
puis remplacer ARRAY_size
avec array1_size
. Je pense qu'il serait bon de ne pas avoir à définir une autre macro de ligne de commande pour spécifier la taille du tableau car je devrais compter le nombre d'éléments, et je vais l'utiliser pour les situations où je ne le fais pas connaître la taille du tableau à l'avance. J'ai donc le compilateur déterminer la taille du tableau. Le soulignement est la raison pour laquelle le préprocesseur échoue son travail? Il est préférable d'utiliser une convention de nommage différente pour la taille du tableau, pour qu'il soit prétraité correctement? Quel autre type d'approche suggérez-vous pour résoudre ce problème?
Ce n'est pas ARRAY, c'est ARRAY_size. C'est une bonne chose que le préprocesseur ne remplace pas une partie d'un identifiant. Imaginez, parmi toutes les macros disponibles, il y en a probablement une dont l'identifiant est contenu dans l'une des vôtres. – chris
C'est ce que je veux que le préprocesseur fasse, remplacer une partie d'un identifiant. Comment le préprocesseur sait-il quand un identifiant se termine? Est-il délimité par des espaces? – Galaxy
Oui, par tout caractère qui ne peut pas continuer l'identifiant. – chris