2009-10-29 7 views
2

Arrière-plan de la question:
void dash(int *n, char c) est de dessiner des caractères c séparés par '+'.
Le paramètre n est un tableau d'entiers, par ex. {1, 3, 2} et '-' pour c devraient donner "+ - + --- + - +", ce qui fonctionne bien. Pour utiliser le tiret je fais {int f={1, 3, 2}; dash(f, '-');}, ce qui rend la copie de construction & passable.

La question elle-même:
Pour éviter & copier-coller que je voulais faire #define F(X, Y) {int f=X; dash(f, Y);}, entraînant une F({1, 3, 2}, '-') bien utilisable.
Malheureusement, le compilateur se plaint de l'obtention de 4 arguments (longueur de tableau + 1) au lieu de 2.

Alors, comment pouvez-vous donner {1, 3, 2} comme paramètre à une macro?Initialisation du tableau C via la macro

+1

La façon dont 'dash' détermine le nombre d'éléments dans le tableau n'est pas claire. Y a-t-il toujours 3? –

+0

Je l'ai implémenté pour arrêter au dernier élément, qui doit être 0. Mais ce n'était pas important pour la question elle-même, donc je l'ai laissé ici. –

Répondre

4

macros VARIADIC sont une caractéristique de C99.

#define F(Y,...) dash((int[]){__VA_ARGS__},Y) 

Alors, comment pouvez-vous donner {1, 3, 2} comme paramètre à une macro?

F('-',1,3,2); 
+0

Je pense que cela devrait être #define F (Y, ...) tiret ((int []) {__ VA_ARGS__}, Y} Notez le transpondeur (int []) et le point-virgule manquant – quinmars

+0

points positifs, corrigés – Will

+0

thx, maintenant je peux vous donner +1 – quinmars

0

Essayez F(({1, 3, 2}), '-')

+0

Cela ne s'étend pas à la bonne C. valide –

1

Au lieu d'essayer d'utiliser une macro pour mettre en place et faire ces appels, je serais probablement envisager de changer l'interface dash() utiliser varargs:

#include <stdarg.h> 

void dash(char c, ...) 
{ 
    // ... 
} 


int main() { 
    dash('+', 1, 3, 2, -1); // note: negative number indicates 
           // the end of the list of numbers 
    return 0; 
} 

L'utilisation de varargs n'est pas la meilleure chose au monde (ils sont difficiles à utiliser et ne sont pas sûrs), mais je pense que ce serait mieux que la concoction de macro que vous essayez de générer. De plus, rappelez-vous que même si vous restez avec votre interface actuelle pour dash() et créez une macro qui fait ce que vous voulez, vous devez toujours avoir un moyen d'indiquer la fin de la séquence de nombres à transmettre dash(). Sinon, le tableau de bord ne peut pas savoir quand il a atteint la fin du tableau. Vous avez plusieurs choix:

  • utiliser une valeur sentinelle, tel que 0, -1, ou tout nombre négatif (comme dans l'exemple vararg ci-dessus)
  • passe le nombre d'éléments dans le tableau comme un argument
  • Définissez la taille de la baie comme faisant partie de l'interface dash(). Dans votre exemple, dash() peut nécessiter la transmission d'un tableau de 3 ints. Pas plus, pas moins (en fait, plus serait OK - ils ne seraient tout simplement pas utilisés). Si vous avez fait cela, la réparation de votre macro serait beaucoup plus facile, mais je suppose que ce n'est pas la façon dont vous voulez que le tableau de bord se comporte.
4

Voici ma version:

#include <stdio.h> 

void dash(int len, int *n, char c){ 
    int i; 
    printf("dash(%i, {", len); 
    for(i=0; i<len-1; i++) 
    printf(" %i,", n[i]); 
    printf(" %i }, '%c')\n", n[i], c); 
} 

#define NOPAREN(...) __VA_ARGS__ 
#define F1(arr,char) { int f[]={NOPAREN arr}; dash(sizeof(f)/sizeof(f[0]),f,char); } 

#define F2(char,...) { int f[]=__VA_ARGS__; dash(sizeof(f)/sizeof(f[0]),f,char); } 

int main(void){ 
    F1((1,3,2), '-'); 
    F2('-', {4,6,5}); 
} 

Résultat:

dash(3, { 1, 3, 2 }, '-') 
dash(3, { 4, 6, 5 }, '-') 
0

Vous pouvez passer { 1, 3, 2 } comme argument à une macro si vous définissez { 1, 3, 2 } comme une autre macro

#define PARAMS { 1, 3, 2 } 
F(PARAMS, '-') 
#undef PARAMS 

Malheureusement, il semble y avoir aucun di façon rectale de faire littéralement ce que vous demandez, c'est-à-dire passer spécifiquement { 1, 3, 2 } sous cette forme spécifique. Il pourrait être utile de passer à d'autres méthodes, y compris les méthodes spécifiques au C99 suggérées dans d'autres réponses.

Questions connexes