Niektóre cytaty z normą C99 (podkreślenie)
6.2.5/25 typu
Każdy typ Dotychczas wymienione to bez zastrzeżeń typu. Każdy nie kwalifikowany typ ma kilka kwalifikowanych wersji tego typu, odpowiadających kombinacjom jednego, dwóch lub wszystkich trzech ograniczeń liczby stałych, niestabilnych i ograniczających. Wykwalifikowany lub niewykwalifikowanych wersje typu są różne rodzaje
6.2.7/2 „zgodny typ i rodzaj kompozytu”
Dwa typy mają typ zgodny jeżeli ich typy są takie same.
...
Wszystkie oświadczenia, które odnoszą się do tego samego obiektu lub funkcji ma typ compatible; inaczej, zachowanie jest niezdefiniowane.
Jeśli myślisz o swoim konkretnym przykładzie przez chwilę, w jaki sposób kod, który widzi tylko następujące oświadczenie:
extern unsigned char flag;
mają pojęcia, że flag
musiałaby być traktowana jako volatile
?
Ponadto, niezwiązane z tym pytaniem, należy pamiętać, że volatile
zwykle nie wystarcza do obsługi dostępu za pośrednictwem wielu wątków (w przypadku, gdy masz zamiar).
Czy używasz kompilatora C lub C++? Wygląda na to, że nie powinieneś używać tutaj znacznika 'C++ '. –
Teraz, jeśli chcesz wiedzieć, czy odpowiedź będzie różna między C i C++, to w porządku. Użyj obu tagów ** i wyjaśnij w swoim pytaniu, w jaki sposób zależy Ci na obu językach **. –
Kompilator, posiadający tylko deklarację * extern * i kod generujący dostęp do zmiennej oczywiście nie może wiedzieć, że ma być traktowany jako niestabilny. Linker nie "naprawia" tego kodu, to nie jest jego zadanie. Nie możesz tego pominąć. –