2017-02-22 6 views
1

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

+1

Dafür sind Header. Vermeiden Sie 'externe' Deklarationen in einer Implementierungsdatei. – Olaf

+0

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. * –

+0

@AndrewHenle Es ist für das Embedded System. Ich denke nicht, dass es nutzlos ist. – i486

Antwort

8

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.

+0

@ 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. –