8
votes

Définir des paramètres inutilisés en C

Je dois utiliser ptheat mais je n'ai pas besoin de transmettre aucun argument à la fonction. Par conséquent, je passe null à la fonction sur pthread_create. J'ai 7 pthreads, alors le compilateur GCC me met en garde que j'ai 7 paramètres non remplis. Comment puis-je définir ces 7 paramètres comme inutilisé dans la programmation C? Si je ne définissais pas ces paramètres comme inutilisé, cela causerait-il un problème? Merci d'avance pour les réponses.

void *timer1_function(void * parameter1){
//<statement>
}

int main(int argc,char *argv[]){
  int thread_check1;
  pthread_t timer1;
  thread_check1 = pthread_create( &timer1, NULL, timer1_function,  NULL);
    if(thread_check1 !=0){
        perror("thread creation failed");
        exit(EXIT_FAILURE);
    }
while(1){}
return 0;
}


5 commentaires

S'ils sont inutilisés, cela implique qu'aucune opération significative n'est effectuée à ces variables et (pour la plupart), elles sont prudentes de se débarrasser de. C'est un avertissement, pas une erreur, donc il peut être ignoré . Ce n'est généralement pas une bonne idée à l'ignorer, mais vous peut .


@HMJD - C ++ le permet, pas C.


Stackoverflow.com/q/7090998/168175


duplicaté possible de Compilateur universellement moyen de mettre en œuvre un Macro non utilisée en C / C ++


Dupliqué possible de Avertissements de paramètres non utilisés en Code C


5 Réponses :


18
votes

Vous pouvez lancer le paramètre sur void comme ceci: xxx


1 commentaires

Stackoverflow.com/a/4851173/168175 a une forme alternative qui fonctionne mieux pour volatile apparemment



0
votes

Il convient parfaitement à l'aide d'un paramètre dans un corps de fonction.

Pour éviter l'avertissement du compilateur (le cas échéant dans votre implémentation), vous pouvez le faire: P>

void *timer1_function(void * parameter1)
{
    // no operation, will likely be optimized out by the compiler
    parameter1 = parameter1;  
}


0 commentaires

1
votes

Par défaut, GCC ne produit pas cet avertissement, pas même avec -wall. Je pense que la solution de contournement montrée dans une autre question peut être nécessaire lorsque vous n'avez aucun contrôle sur l'environnement, mais si vous le faites, supprimez simplement le drapeau ( - paramètre-paramètre ).


4 commentaires

+1 C'est la meilleure solution. Cet avertissement est fondamentalement idiot. Chaque fois que l'adresse d'une fonction est prise, GCC devrait désactiver les avertissements "paramètres non utilisés", car ils sont utilisés en interne ou non, ils sont utilisés dans le cadre de l'interface requise pour la fonction. Personnellement, je dirais que la même chose devrait s'appliquer à toutes les fonctions externes ...


@R J'ai attrapé un bogue dans mon code il y a quelques jours grâce à cet avertissement. Je faisais un refacteur de certaines fonctions et tapé 0 au lieu de l'identifiant pour un masque de bit qui est entré en tant que paramètre de fonction. Activités -Wextra m'a permis de réparer immédiatement un bogue subtil qui avait été introduit il y a des jours.


-1: Je trouve régulièrement des bogues grâce à cet avertissement étant activé.


Pour le code qui est de nombreuses années et modifié ... Au fil du temps, des arguments sont ajoutés et finissent par être inutilisé plus tard. Cet avertissement peut donc être très utile, surtout quand il devient un problème de passer un argument à une fonction (recherche ou si cela doit être calculé), seulement pour trouver ce n'est même pas utilisé.



18
votes

GCC dispose d'une installation "attributs" pouvant être utilisée pour marquer des paramètres inutilisés. Utilisez

void *timer1_function(__attribute__((unused))void *parameter1)


0 commentaires

2
votes

Deux techniques couramment utilisées:

1) omettent le nom du paramètre non utilisé: p> xxx pré>

2) commencent le nom du paramètre: P>

void *timer1_function(void * /*parameter1*/) { ... }


1 commentaires

Je reçois un nom de paramètre omis si je le fais (en C11). Assez sûr que cela n'est pas valide pour C (plutôt que C ++).