Αποφύγετε την προειδοποίηση "Μη αναφορά επίσημη παράμετρος"

Αποφύγετε την προειδοποίηση "Μη αναφορά επίσημη παράμετρος"

Στη C++ δεν χρειάζεται να δώσετε μια παράμετρο που δεν χρησιμοποιείτε όνομα, ώστε να μπορείτε απλώς να κάνετε αυτό:

void Child::Function(int)
{
    //Do nothing
}

Ωστόσο, μπορεί να θέλετε να διατηρήσετε το όνομα της παραμέτρου στη δήλωση στο αρχείο κεφαλίδας ως τεκμηρίωση. Η κενή δήλωση (; ) είναι επίσης περιττό.


Προτιμώ να χρησιμοποιώ μια μακροεντολή, καθώς λέει όχι μόνο στον μεταγλωττιστή την πρόθεσή μου, αλλά και σε άλλους συντηρητές του κώδικα, και είναι δυνατή η αναζήτηση αργότερα.

Η μέθοδος σχολιασμού του ονόματος του επιχειρήματος μπορεί εύκολα να χαθεί από άτομα που δεν είναι εξοικειωμένα με τον κώδικα (ή εγώ 6 μήνες αργότερα).

Ωστόσο, είναι ένα θέμα στυλ, καμία μέθοδος δεν είναι "καλύτερη" ή πιο βέλτιστη όσον αφορά τον κώδικα που δημιουργείται, την απόδοση ή την ευρωστία. Για μένα, ο αποφασιστικός παράγοντας είναι η ενημέρωση των άλλων για την πρόθεσή μου μέσω ενός τυποποιημένου συστήματος. Η παράλειψη του ονόματος της παραμέτρου και η προσθήκη ενός σχολίου θα λειτουργούσαν εξίσου καλά:

void CFooBar::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
    UNREFERENCED_PARAMETER(pNMHDR);

Εναλλακτικά:

void CFooBar::OnLvnItemchanged(NMHDR* /* pNMHDR */, LRESULT *pResult)
{
    // Not using: pNMHDR

Θα έλεγα ότι η χειρότερη λύση είναι η καταστολή του προειδοποιητικού μηνύματος. ότι αυτό θα επηρεάσει ολόκληρο το αρχείο ή το έργο σας και θα χάσετε τη γνώση ότι ίσως χάσατε κάτι. Τουλάχιστον προσθέτοντας τη μακροεντολή ή σχολιάζοντας το όνομα του επιχειρήματος, έχετε πει στους άλλους ότι έχετε λάβει συνειδητή απόφαση να μην χρησιμοποιήσετε αυτό το επιχείρημα και ότι δεν είναι λάθος.

Το Windows SDK στο WinNT.h ορίζει το UNREFERENCED_PARAMETER() μαζί με το DBG_UNREFERENCED_PARAMETER() και DBG_UNREFERENCED_LOCAL_VARIABLE() . Όλα αξιολογούνται με το ίδιο πράγμα, αλλά η διαφορά είναι ότι η DBG_UNREFERENCED_PARAMETER() χρησιμοποιείται όταν ξεκινάτε και περιμένετε να χρησιμοποιήσετε την παράμετρο όταν ο κώδικας είναι πιο ολοκληρωμένος. Όταν είστε σίγουροι ότι δεν θα χρησιμοποιήσετε ποτέ την παράμετρο, χρησιμοποιήστε την έκδοση UNREFERENCED_PARAMETER().

Οι τάξεις Microsoft Foundation (MFC) έχουν παρόμοια σύμβαση, με τη συντομότερη UNUSED() και UNUSED_ALWAYS() μακροεντολές.

Διαλέξτε ένα στυλ και επιμείνετε σε αυτό. Με αυτόν τον τρόπο αργότερα μπορείτε να αναζητήσετε "DBG_UNREFERENCED_PARAMETER " στον κώδικά σας και βρείτε τυχόν περιπτώσεις όπου περιμένατε να χρησιμοποιήσετε ένα επιχείρημα, αλλά δεν το κάνατε. Υιοθετώντας ένα συνεπές στυλ και τη συνήθη χρήση του, θα διευκολύνετε τους άλλους και τον εαυτό σας αργότερα.


Μια άλλη τεχνική που μπορείτε να χρησιμοποιήσετε εάν θέλετε να διατηρήσετε το όνομα της παραμέτρου είναι η μετάδοση σε void:

void Child::Function(int param)
{
    (void)param;   //Do nothing
}