Hoe kan ik “ongebruikte parameter”-waarschuwingen in C onderdrukken?

Bijvoorbeeld:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

In C++ kon ik een /*...*/commentaar rond de parameters plaatsen. Maar niet in C natuurlijk, waar ik de fout krijg:

fout: parameternaam weggelaten


Antwoord 1, autoriteit 100%

Meestal schrijf ik een macro als volgt:

#define UNUSED(x) (void)(x)

U kunt deze macro gebruiken voor al uw ongebruikte parameters. (Merk op dat dit op elke compiler werkt.)

Bijvoorbeeld:

void f(int x) {
    UNUSED(x);
    ...
}

Antwoord 2, autoriteit 38%

In GCC kun je de parameter labelen met de UNUSEDkenmerk.

Dit attribuut, gekoppeld aan een variabele, betekent dat de variabele is
bedoeld om mogelijkongebruikt te zijn. GCC zal hiervoor geen waarschuwing geven
variabel.

In de praktijk wordt dit bereikt door __attribute__ ((unused))net voor de parameter te plaatsen. Bijvoorbeeld:

void foo(workerid_t workerId) { }

wordt

void foo(__attribute__((unused)) workerid_t workerId) { }

Antwoord 3, autoriteit 20%

Je kunt GCC of Clang‘s ongebruiktkenmerk . Ik gebruik deze macro’s echter in een header om te voorkomen dat ik GCC-specifieke attributen overal in de bron heb, en het is ook een beetje uitgebreid/lelijk om overal __attribute__te hebben.

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif
#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

Dan kun je…

void foo(int UNUSED(bar)) { ... }

Ik geef hier de voorkeur aan omdat je een foutmelding krijgt als je ergens barin de code probeert te gebruiken, dus je kunt het kenmerk niet per ongeluk laten staan.

En voor functies…

static void UNUSED_FUNCTION(foo)(int bar) { ... }

Opmerking 1):

Voor zover ik weet, heeft MSVCgeen equivalent naar __attribute__((__unused__)).

Opmerking 2):

De macro UNUSEDwerkt niet voor argumenten die haakjes bevatten,
dus als je een argument hebt zoals float (*coords)[3]dat nietkan,
float UNUSED((*coords)[3])of float (*UNUSED(coords))[3]. Dit is het enige nadeel van de UNUSEDmacro die ik tot nu toe heb gevonden, en in deze gevallen val ik terug op (void)coords;.


Antwoord 4, autoriteit 6%

Met GCC met de ongebruiktkenmerk:

int foo (__attribute__((unused)) int bar) {
    return 0;
}

Other episodes