Inutilisés paramètre en c++11
En c++03 et plus tôt pour désactiver l'avertissement du compilateur sur inutilisé paramètre j'ai l'habitude d'utiliser ce type de code:
#define UNUSED(expr) do { (void)(expr); } while (0)
Par exemple
int main(int argc, char *argv[])
{
UNUSED(argc);
UNUSED(argv);
return 0;
}
Mais les macros ne sont pas les meilleures pratiques pour le c++, donc.
N'importe quelle meilleure solution apparaissent avec c++11? Je veux dire que je peux me débarasser des macros?
Merci pour tout!
- Assurez-vous. Désactiver l'avertissement.
- Non! Ne pas le faire!
- Comment beaucoup mieux, c'est que la macro que de l'élargir inline?
(void)argc;
est plus court et plus clair queUNUSED(argc);
- J'aime
unused(argc, argv)
avectemplate<class... T> void unused(T&&...){}
. Clair, concis, et sans macros. - oh non les macros doivent pas utiliser les macros
- Si un paramètre n'est pas utilisé, pourquoi est-il là en premier lieu?
- Parfois, vous avez besoin pour se conformer à une certaine interface (par exemple lors du remplacement d'une fonction virtuelle ou en programmation générique).
s/sometimes/most of the time/
- mais vous pouvez laisser sans nom de l'argument, ou même juste un commentaire, c'est le nom.
void foo(int /*unused_arg*/, int used_arg)
- Qui ne peut pas être fait pour "peut-être" utilisé des arguments, par exemple, conditionnel à l'inclusion où une branche besoin de l'argumentation et de l'autre branche n'a pas. Les envelopper également dans
#ifdef
est trop verbeux. Il n'y aurait[[maybe_unused]]
en C++17, mais il arrive trop tard. - C'est pas tout à fait idéal, car "inutilisé" peut indiquer de travailler non seulement sur des arguments, mais aussi des expressions. J'utilise cette construction pour exprimer explicitement prévu séquencé d'évaluation sur la non-
void
expressions. Otoh, que, "non utilisé" est utilisé plus généralement, mise en œuvre de coulée à vide. - C'est assez proche de ce que j'utilise mais j'ai récemment trouver il ne peut pas travailler pour le paramètre packs. C'est pourquoi je recherche pour la réponse et vient ici. Malheureusement je n'arrive toujours pas à trouver une solution portable idéale.
- Vous ne devriez pas donner de réponse à votre question. Il est injuste wrt qui répond à votre question.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé une fonction dont le corps est vide à cette fin:
Je m'attendre à des graves compilateur d'optimiser l'appel de la fonction et des silences mises en garde pour moi.
T
est un paramètre du modèle,T&&
est un de référence universel, qui se lie à quoi que ce soit.ignore(a, b, anythingElseThatBothersYou);
constexpr
fonction.int main( int /* argc */, char ** /* argv */ )
std::ignore
si l'on a utiliséusing namespace std;
naïvement.ignore
fonctioninline
. (Si la fonction est mis dans un fichier d'en-tête et le compilateur n' pas optimiser, alors il pourrait y avoir plusieurs instances de la même spécialisation dans les fichiers de l'objet.)Vous pouvez simplement omettre les noms de paramètre:
Et dans le cas de la main, vous pouvez omettre les paramètres tout à fait:
Voir "§ 3.6 de Début et de fin" dans le C++11.
main
, vous pouvez omettre les paramètres tout à fait. Et lereturn
déclaration, pour cette question.main
'sreturn 0
dans un cas de test, mais presque toujours écrire l'auto-documentationreturn EXIT_SUCCESS
dans le code de production. Que's bonne pratique!Il est le
<tuple>
dans C++11, qui comprend le prêt à usagestd::ignorer
objet, qui permet d'écrire (très probablement sans imposer d'exécution frais généraux):Rien d'équivalent, pas de.
Donc, vous êtes coincé avec la même vieille options. Êtes-vous heureux d'omettre les noms dans la liste des paramètres entièrement?
Dans le cas spécifique de
main
, bien sûr, vous pourriez tout simplement omettre les paramètres eux-mêmes:Il y a aussi typique de mise en œuvre-astuces spécifiques, tels que GCC est
__attribute__((unused))
.À "désactiver" cet avertissement, le mieux est d'éviter l'écriture de l'argument, il suffit d'écrire le type.
ou si vous préférez, en commentaire:
Vous pouvez mélanger nommé et sans nom d'arguments:
Avec C++17 vous avez [[maybe_unused]] attribut prescripteur, comme:
/* ... */
#if 0
blocs comme un cas particulier, même si elles ne prennent pas en charge complète de préprocesseur intellisense.Macros peut-être pas idéal, mais ils font un bon travail pour cet usage particulier. Je dirais bâton à l'aide de la macro.
MAYBE_UNUSED
, pour cette raison; en général, je n'aime pas si je l'ai dit "ne vous inquiétez pas si je ne l'utilise pas en-dessous de" mais il va le faire de toute façon.#ifdef
blocs, vous pouvez mettre le nom du paramètre à l'intérieur d'un tel bloc de trop.#ifdef
et#endif
directives doivent être placés sur la ligne de leur propre, qui, en réalité, visser la tête de la fonction... au point d'être quasiment illisible.Ce que vous avez à l'encontre de l'ancien et du moyen standard?
Il n'y a rien de nouveau disponible.
Ce qui fonctionne le mieux pour moi est de mettre en commentaire le nom du paramètre dans la mise en œuvre. De cette façon, vous vous débarrasser de l'avertissement, mais conservent encore une certaine notion de ce que le paramètre est (puisque le nom est disponible).
Votre macro (et tous les autres acteurs-à-void approche a l'inconvénient que vous pouvez réellement utiliser le paramètre après l'utilisation de la macro. Cela peut rendre le code plus difficile à maintenir.
Le coup de pouce de l'en-tête
<boost/core/ignore_unused.hpp>
(Boost >= 1.56) définit, à cette fin, le modèle de fonctionboost::ignore_unused()
.PS C++17 a la
[[maybe_unused]]
attribut supprime les avertissements sur inutilisé entités.[[maybe_unused]]
est explicite, actuellement le meilleur.J'aime vraiment utiliser des macros pour cela, car elle permet un meilleur contrôle lorsque vous avez plusieurs versions de débogage (par exemple, si vous voulez construire avec affirme activé):
et de l'utiliser ensuite comme:
J'ai ma propre mise en œuvre de critique de segments de code.
J'ai fait des recherches un tout en un moment critique de code pour ralentir et avoir trouvé cette application consomme environ 2% à partir de la critique de code que j'ai optimisé:
La critique de code a utilisé le
ASSERT*
définitions pour les fins de débogage, mais dans la version qu'il a clairement coupé, mais... Semble que celui-ci produit un peu plus rapide code dansVisual Studio 2015 Update 3
:La raison en est double
false ?
expression. C'est en quelque sorte produit un peu plus rapide code dans la version avec l'optimisation maximale.Je ne sais pas pourquoi c'est plus rapide (qui semble être un bug dans l'optimisation du compilateur), mais c'est au moins une meilleure solution pour ce cas de code.
Note:
Le plus important ici est que une fois le code critique de ralentissements sans au-dessus des assertions ou inutilisés des macros dans le communiqué. En d'autres termes le double
false ?
expression étonnamment aide à optimiser un code.windows.h définit UNREFERENCED_PARAMETER:
De sorte que vous pourriez faire comme ceci:
Ou à l'extérieur de Windows:
operator=
peuvent avoir des effets secondaires.