Na przykład:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
W C ++ byłem w stanie /*...*/
skomentować parametry. Ale oczywiście nie w C, gdzie daje mi to błąd error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
źródło
źródło
-Wno-unused-parameter
, jest po prostu zbyt głośno i rzadko łapie błędy, szczególnie. kiedy-Wshadow
jest używany.Odpowiedzi:
Zwykle piszę takie makro:
Możesz użyć tego makra do wszystkich nieużywanych parametrów. (Uwaga: działa to na dowolnym kompilatorze).
Na przykład:
źródło
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
co pozwala mi zastosować to do wielu zmiennych.W gcc możesz opisać parametr za pomocą
unused
atrybutu .W praktyce osiąga się to poprzez umieszczenie
__attribute__ ((unused))
tuż przed parametrem. Na przykład:staje się
źródło
__attribute__ ((unused))
przed argumentem.__attribute__((unused))
jest to zastrzeżone rozszerzenie GCC . Jest obsługiwany przez inne kompilatory, ale zakładam, że to nie będzie działać z MSVC. Nie jest to jednak bezpośrednio część standardu kompilatora, więc nie jest tak przenośne, jak niektóre inne opcjeMożesz użyć nieużywanego atrybutu gcc / clang, jednak ja używam tych makr w nagłówku, aby uniknąć posiadania specyficznych atrybutów gcc w całym źródle, również posiadanie
__attribute__
wszędzie jest trochę gadatliwe / brzydkie.Następnie możesz zrobić ...
Wolę to, ponieważ pojawia się błąd, jeśli spróbujesz użyć
bar
kodu w dowolnym miejscu, więc nie możesz przez pomyłkę pozostawić atrybutu.i dla funkcji ...
Uwaga 1):
O ile mi wiadomo, MSVC nie ma odpowiednika
__attribute__((__unused__))
.Uwaga 2): makro nie będzie działać na argumentach, które zawierają nawias, więc jeśli masz argument jak ty nie może zrobić, albo , to jedynym minusem do makro znalazłem do tej pory, w tych przypadkach spadnę z powrotem do
UNUSED
float (*coords)[3]
float UNUSED((*coords)[3])
float (*UNUSED(coords))[3]
UNUSED
(void)coords;
źródło
#define __attribute__(x)
dla środowiska innego niż GCC (AFAIK żaden z nich nie__attribute__
jest obsługiwany przez MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Z gcc z nieużywanym atrybutem:
źródło
Widząc, że jest to oznaczone jako gcc, możesz użyć przełącznika wiersza poleceń
Wno-unused-parameter
.Na przykład:
Oczywiście wpływa to na cały plik (i może projekt, w zależności od ustawienia przełącznika), ale nie musisz zmieniać żadnego kodu.
źródło
Specyficznym sposobem gcc / g ++ na wyłączenie ostrzeżenia o nieużywanym parametrze dla bloku kodu źródłowego jest dołączenie go z następującymi instrukcjami pragma:
źródło
Oznaczenie atrybutu jest idealnym sposobem. MAKRO prowadzi do zamieszania. i używając void (x), dodajemy koszty ogólne w przetwarzaniu.
Jeśli nie używasz argumentu wejściowego, użyj
Jeśli nie używasz zmiennej zdefiniowanej w funkcji
Teraz później używasz zmiennej hash dla twojej logiki, ale nie potrzebuje bkt. zdefiniuj bkt jako nieużywany, w przeciwnym razie kompilator powie „bkt set bt not used”.
UWAGA: Ma to na celu wyłączenie ostrzeżenia, a nie optymalizację.
źródło
void(x)
, kompilator zoptymalizuje go.Mam ten sam problem. Użyłem biblioteki trzeciej części. Kiedy skompiluję tę bibliotekę, kompilator (gcc / clang) będzie narzekał na nieużywane zmienne.
Lubię to
Więc rozwiązanie jest całkiem jasne. Dodanie
-Wno-unused
jako CFCAG gcc / clang spowoduje usunięcie wszystkich „nieużywanych” ostrzeżeń, nawet jeśli są-Wall
ustawione.W ten sposób NIE POTRZEBUJESZ zmiany kodu.
źródło
W MSVC, aby pominąć określone ostrzeżenie, wystarczy podać jego numer do kompilatora jako / wd #. Mój CMakeLists.txt zawiera taki blok:
Teraz nie mogę powiedzieć, co dokładnie oznaczają / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127, ponieważ nie zwracam uwagi na MSVC przez trzy lata, ale tłumią one superantyczne ostrzeżenia, które nie wpływają na wynik.
źródło
Widziałem używany ten styl:
źródło
struct { int a; } b = {1}; if (b);
GCC ostrzegaused struct type value where scalar is required
.Dla przypomnienia, podoba mi się powyższa odpowiedź Hioba, ale jestem ciekawa rozwiązania, w którym sama nazwa zmiennej byłaby użyta w instrukcji „nic nie robić”:
Jasne, ma to wady; na przykład bez „nieużywanej” nuty wygląda raczej na pomyłkę niż zamierzoną linię kodu.
Korzyścią jest to, że DEFINE nie jest potrzebne i pozbywa się ostrzeżenia.
Czy jest jakaś wydajność, optymalizacja lub inne różnice?
źródło