Was passiert, wenn eine Variable als volatile int x
in file1.c
und extern int x
in file2.c
(statt extern volatile int x
) definiert ist? Gibt es eine Möglichkeit für den Compiler zu wissen, dass x
flüchtig ist und kompilieren Sie als solche in file2.c
.definieren volatile int Variable als extern int
Antwort
Der Compiler hat nur Kenntnis der aktuellen translation unit (im Grunde die aktuelle Quelldatei mit allen Includes), sonst nichts.
Wenn eine extern
Variable nicht mit dem richtigen Typ deklariert wird, haben Sie ein undefiniertes Verhalten.
@ i486 Globale Variablen (technisch Variablen in * Datei-Bereich *) haben standardmäßig * externe Verknüpfung *. Eine Deklaration ohne Initialisierung ist eine * vorläufige * Definition, * kann * eine Definition oder nur eine Deklaration sein. Lesen Sie z.B. [diese Verknüpfungsreferenz] (http://en.cppreference.com/w/c/language/storage_duration#Linkage) und [diese externe und vorläufige Definitionsreferenz] (http://en.cppreference.com/w/c/ Sprache/extern) für weitere Informationen. –
- 1. int * const AND extern int *
- 2. Deklaration einer globalen Variable `extern const int` im Header aber nur` int` in der Quelldatei
- 3. Inkrementieren durch int [] als int
- 4. Was ist der Unterschied zwischen `extern int (x) []` und `extern int x []` in C?
- 5. Wie const int mit extern verwenden
- 6. Warum ist ein Point-to-Volatile-Zeiger wie "volatile int * p" nützlich?
- 7. shell: awk zu int Variable
- 8. Wie kann ich eine Variable als Index in getResourceId verwenden (int index, int defValue);
- 9. Swift Convert Int [] Variable
- 10. Typ int * (*) (int *, int * (*)())
- 11. Warum int/int = int?
- 12. Statische Variable vs Volatile
- 13. Was ist der Unterschied zwischen int -> int -> int und (int * int) -> int in SML?
- 14. Warum (int) ((unsigned int) ((int) v)?
- 15. definieren Map [Int, String] mit langen Strings als richtigen Wert
- 16. Den int-Wert eines char in eine int-Variable speichern
- 17. kann keine int echo Variable
- 18. Haskell verwirrt Int mit Int -> Int
- 19. Warum funktioniert Decimal.Divide (int, int), aber nicht (int/int)?
- 20. Return int als boolean
- 21. C# enums als int
- 22. Int Divide Int Int und Rück
- 23. (int **) malloc (sizeof (int *))
- 24. JavaScript Variable auf eine JSP Variable (int)
- 25. Wie deserialize [[int, int, int, int, string, string], [...]] von JSON
- 26. Welcher Typ ist int (int) & oder int (int) const &?
- 27. Teilweise volatile Variable?
- 28. SQL [int] versus int
- 29. dynamic_cast (int * int *) - Übersetzungsfehler
- 30. Nur Int zu Int
Dafür sind Header. Vermeiden Sie 'externe' Deklarationen in einer Implementierungsdatei. – Olaf
Etwas OT, aber hoffentlich verlassen Sie sich nicht auf "volatile", um tatsächlich etwas Nützliches für eine C-Variable in einem Multithread-Programm zu tun? Siehe [Volatile: Fast nutzlos für Multi-Threaded-Programmierung] (https://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-hread-programming): * ... die Verwendung von volatile führt nur dazu, dass der Compiler keine nützlichen und wünschenswerten Optimierungen vornehmen kann und keine Hilfe bei der Erstellung von Code "thread safe" bietet. * –
@AndrewHenle Es ist für das Embedded System. Ich denke nicht, dass es nutzlos ist. – i486