2017-05-22 46 views
5

Tak, mam ten kod:Jak znaleźć zmienne, które powinny być stałe w C?

uint8_t* pbytes = pkt->iov[0].iov_base; 

który tworzy wskaźnik do początku pakietu ethernet w strukturze.

I proszę mojego przyjaciela, aby spojrzał na kod, a on mówi: "Nie modyfikujecie tego i byłoby naprawdę mylące, gdybyście to zrobili, więc niech to będzie stałe".

I to wydaje się dobrym pomysłem, więc:

const uint8_t* pbytes = pkt->iov[0].iov_base; 

lub nawet:

const uint8_t * const pbytes = pkt->iov[0].iov_base; 

A teraz myślę, założę istnieje mnóstwo innych miejsc, gdzie mogłem zrobić to i założę się, że kompilator lepiej będzie je znaleźć niż ja.

Jakieś pomysły, jak zadaję to pytanie? (preferowany gcc, ale bez problemów przy użyciu innego kompilatora lub narzędzia lintingowego, o ile będą działać w systemie Unix).

+1

'const uint8_t * pbytes' nie jest stała. C nie ma stałych symbolicznych innych niż _enum-constants_ (które są zawsze 'int')! To nie jest C++. – Olaf

+0

Nie mogę wymyślić żadnego łatwego sposobu zautomatyzowania tego. Możesz zadeklarować wszystko "const", a następnie usunąć je dla zmiennych, które powodują błędy. – Barmar

+1

Druga 'const' musi być zgodna z' * '. 'const uint8_t * const pbytes = ...; 'definiuje' pbytes' jako wskaźnik const do const 'uint8_t'. –

Odpowiedz

-2

const propaguje. W rzeczywistości często staje się problemem i nazywa się "zatruciem stałym". Problemem jest funkcja podobna do strchr(), która może być wywołana ze wskaźnikiem const lub ze zmienną. Ale jeśli zwraca const *, ciąg nie może być modyfikowany za pomocą wskaźnika, co często jest tym, co chcesz zrobić.

Ale jeśli po prostu ustawisz stałą stałą danych w punkcie bezpośrednio po wczytaniu/zainicjalizowaniu, kompilator będzie wyświetlał błędy przy każdym podejściu do kontekstu, który nie jest ograniczony.

+1

'strchr' jest jedną z kilku standardowych funkcji bibliotecznych, które mogą naruszać' const'-correctness. Nie oznacza to podstawowego problemu z 'const'. –

+0

Rzeczywiście problem polega raczej na tym, że biblioteka standardowa C składa się z wielu starych, napisanych w formie crappily funkcji, takich jak strchr. To niedociągnięcie standardowej biblioteki nie jest wymówką, by napisać fałszywy kod gdzie indziej. – Lundin

4

GCC ma flagę sugerujące korzystne atrybuty jak const

-Wsuggest-atrybut = const [czystą | | | noreturn formatu] ostrzec o przypadkach, w których dodanie atrybutu może być korzystne. Aktualnie obsługiwane atrybuty są wymienione poniżej.

-Wsuggest atrybut = czysty
-Wsuggest atrybut = const
-Wsuggest atrybut = noreturn
Ostrzeżenie o funkcje, które mogą być kandydatami do atrybutów czysty const lub noreturn. Tylko kompilator ostrzega o funkcjach widocznych w innych jednostkach kompilacji lub (w przypadku czystych i stałych), jeśli nie może udowodnić, że normalnie funkcja zwraca standard . Funkcja powraca normalnie, jeśli nie zawiera nieskończonej pętli lub zwraca się nieprawidłowo przez rzucanie, wywoływanie przerwania lub pułapkowanie . Ta analiza wymaga opcji -fipa-pure-const, która jest włączona domyślnie w -O i wyższa. Wyższe poziomy optymalizacji poprawiają dokładność analizy.

Src: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

+0

Niestety, wydaje się, że dotyczy to tylko funkcji. –