2017-04-02 5 views
0

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?

+0

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

+0

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

+0

Oui, par tout caractère qui ne peut pas continuer l'identifiant. – chris

Répondre

1

Du point de vue de préprocesseur, vous ne pouvez pas définir une FOO macro à BAR et attendez FOO_size pour devenir BAR_size parce FOO et FOO_size sont différents jetons.

Vous pouvez cependant, créer une macro de pâte à l'étape suivante:

#define GLUE(a,b) GLUEI(a,b) 
#define GLUEI(a,b) a##b 
... 
int* sorted_array = SORT_ALG(ARRAY, GLUE(ARRAY,_size)); 

Les besoins macro à venir dans une paire avec une macro indirecte pour permettre à ses arguments de se développer. En raison des règles de macro-expansion, ARRAY dans la macro se développera en premier (étant donné l'indirection), ce qui signifie que si vous le définissez comme autre chose qui s'appliquera avant le collage.

Mais en dehors de la perspective du préprocesseur, pourquoi prenez-vous la peine d'utiliser les paires de jetons correspondantes? Si array1_size va juste être affecté à sizeof(array1)/sizeof(array1[0]), vous pouvez juste changer cela en SORT_ALG(ARRAY, (sizeof(ARRAY)/sizeof(ARRAY[0]))).

(Aussi, que faites-vous ici?) Il semble qu'il pourrait y avoir une bien meilleure implémentation en C++ si vous faites quelque chose de plus complexe que le benchmarking de quelque chose de spécifique, et je suis perplexe. ligne de commande pour basculer entre les algorithmes).

+0

Je suis d'accord avec votre deuxième suggestion. Cela semble être une meilleure solution. – Galaxy