Supprimer avertissement du Compilateur Fonction déclarée jamais référencé
Donc j'ai un code comme ceci:
void foo (int, int);
void bar ( )
{
//Do Stuff
#if (IMPORTANT == 1)
foo (1, 2);
#endif
}
Lors d'une compilation sans "IMPORTANT", je reçois un message d'Avertissement du compilateur que foo est défini et jamais référencé. Ce qui m'a fait penser (c'est le problème).
Donc, pour résoudre ce problème que je viens d'ajouter la même #if (IMPORTANT == 1)
autour de la définition de la fonction, etc... pour supprimer le message d'avertissement, puis j'ai commencé à me demander si il y avait un autre moyen de supprimer cet avertissement sur cette fonction. J'étais en train de regarder "inutilisé" de GCC attrib et je ne savais pas si les fonctions ont le même attribut je pourrais le mettre? Est-il encore un autre moyen de supprimer ce qui supprime cet avertissement que pour la fonction et non pas le fichier?
ignored
: gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html. Je pense que push
et pop
peut être utilisé pour couvrir juste une fonction, mais je ne peux pas dire que j'ai jamais eu.stackoverflow.com/questions/386220/... pourrait aider
Oui j'ai vu ces derniers, mais ils semblent pour supprimer le solde non utilisé des avertissements dans le fichier en entier au lieu de simplement que la fonction spécifique, à moins que j'ai lu de travers.
Quel avertissement options que vous utilisez? Vous devriez recevoir cet avertissement pour une inutilisés
static
fonction. Dans ce cas, si vous déclarez static inline
l'avertissement doit s'en aller.Je ne reçois un avertissement quand je le déclarer
static
ce que je suis absent?OriginalL'auteur Jtello | 2012-06-20
Vous devez vous connecter pour publier un commentaire.
Il pourrait y avoir l'option de compilateur(s) pour supprimer cette alerte. Toutefois, une astuce est la suivante:
Il devrait supprimer cette alerte.
Vous pouvez écrire une macro:
Comme vous pouvez le voir, la définition de
foo
lui-même supprime l'avertissement.En fait, la macro que vous avez peut être utilisé pour supprimer inutilisés.
Cela ne fonctionne pas pour les fonctions surchargées que vous ne semblent pas être autorisés à émettre l'adresse d'une fonction surchargée à vide.
Aussi, avec Clang 3.4 au moins, cela semble remplacer le solde non utilisé de la fonction d'avertissement avec une nouvelle "Fonction n'est pas nécessaire et ne sera pas émis d'avertissement":)
Il a bien fonctionné à l'intérieur de la définition elle-même dans
g++
, mais pas dansgcc
. toutes les autres solutions de contournement?OriginalL'auteur Nawaz
Je suis assez sûr que pertinentes de l'option d'avertissement est celui-ci:
Si l'avertissement ne doit être accordée que pour une
static
fonction, intéressant. Du sens. Si une fonction eststatic
il ne peut être utilisé dans le fichier actuel, de sorte que sa définition doit également être dans ce fichier.Et les déclarer
static inline
évite l'avertissement, sans recourir à laide des macros ou le compilateur spécifique pragmas ou attributs.static inline
en effet "permet d'éviter l'avertissement [que pour la fonction], sans recourir à laide des macros ou le compilateur spécifique pragmas ou attributs". Si vous avez d'avoir de telles fonctions dans un fichier c++ sans utiliser, l'utilisation de lainline
tag.static inline
n'est pas (toujours) de supprimer ce pour clang.OriginalL'auteur Jonathan Wakely
Une solution est par l'intermédiaire de la fonction d'attributs.
Ce sera de demander à gcc de ne pas délivrer un solde non utilisé de la fonction d'avertissement de la fonction
foo
. Si vous êtes inquiet au sujet de la portabilité, vous pouvez définir une macroUNUSED_FUNCTION_ATTRIBUTE
qui se développe à__attribute__ ((unused))
avec les compilateurs qui prennent en charge les attributs, mais s'étend à rien sinon.UNUSED_FUNCTION_ATTRIBUTE
. Vous pouvez définir le compilateur qui ne prend pas en charge gnu attributs#define __attribute__(x)
pour les faire disparaître. Il a l'avantage qu'il annule tous les attributs (pur, const, malloc, printf, etc.) et vous n'avez pas besoin de plusieurs ad-hoc des macros pour toutes les différentes variantes. C'était la raison initiale pour l'étrange double parenthèse syntaxe de la__attribute__
extension gnu, de sorte que même archaïque préprocesseurs sansVARARGS
pourrait neutraliser.Oui, vous pouvez le faire de cette façon, mais c'est essentiellement en invoquant un comportement indéfini. Tout identifiant, macro ou autre, qui commence par un trait de soulignement double est la propriété exclusive de la mise en œuvre. Pour être conforme à la norme, le niveau de l'utilisateur code peut utiliser ceux (comme des extensions de la norme prévue par la mise en œuvre), mais le code de l'utilisateur ne doit pas modifier ou définir de tels identifiants.
Cette solution est particulièrement agréable si si oui ou non votre fonction va être utilisé dépend d'un moment de la compilation du choix, mais vous voulez continuer à inclure la fonction de l'objet par exemple, pour l'amour de tests unitaires. C'est alors une question de la modification de l'en-tête au moment de la compilation.
Œuvres pour gcc et clang. +1.
OriginalL'auteur David Hammen
En C++17 vous pouvez déclarer votre fonction avec
[[maybe_unused]]
:Cela va supprimer l'avertissement et est le bon, idiomatiques façon d'exprimer une éventuellement inutilisés fonction en C++17.
OriginalL'auteur TartanLlama
Un bon moyen pour encapsuler le compilateur et dépendant du système des choses est de tenir dans les en-têtes. Ensuite, vous réglez le chemin d'inclusion, selon le compilateur et le système et peut-être d'autres choses. Vous pouvez faire de même pour les fichiers de code source.
Dans ce cas, la déclaration ne semble pas dépendre du compilateur, ou d'un système, alors il suffit d'ajouter le suivant en-tête commun:
Avec la mise en œuvre de fichier
Alors, pour la construction où quelque chose devait arriver, ajoutez le chemin d'un répertoire contenant
Et de la construction où rien ne devrait se passer, ajouter le chemin d'un répertoire contenant
Si vous avez peur que l'appel d'une fonction vide sera très coûteuse en temps, comme, d'une nano-seconde gaspillé, il suffit de déplacer les définitions pour les en-têtes et ajouter le mot
inline
.Si
foo
est également utilisé pour d'autres fins, de définir une fonctionbar
qui l'appelle pour le devrait-ou-doit-pas-chose, et le faire ci-dessus pourbar
au lieu defoo
.Ensuite, vous avez supprimé toutes les préprocesseur choses.
Rappelez-vous que les directives de préprocesseur dans le code sont ungood.
OriginalL'auteur Cheers and hth. - Alf
Je trouve un moyen de le faire à l'échelle mondiale et cela marche aussi dans
c
puis vous l'utilisez comme:
OriginalL'auteur Ameen
Pour BRAS de la plate-forme cible lors de l'utilisation, BRAS compilateur, Utilisez la directive du compilateur autour de l'objectif de fonction pour supprimer ces message d'avertissement:
OriginalL'auteur Amit
Vous pouvez également définir _CRT_SECURE_NO_DEPRECATE macro dans Visual studio paramètres du projet.
Goto Propriétés du projet -> Propriétés de Configuration -> C/C++ -> Préprocesseur -> Définitions de Préprocesseur
Ajouter _CRT_SECURE_NO_DEPRECATE.
Thats it.!
OriginalL'auteur Shivaraj Bhat