[LINUX] Deklaration globaler Variablen der C-Sprache

Zweck

Verwendung globaler Variablen und deren Bestätigung

*** Ich habe viele Ratschläge von @fujitanozomu erhalten, daher habe ich dieses Memo erheblich überarbeitet. Ich möchte den Revisionsverlauf so weit wie möglich beibehalten, konnte jedoch den Unterschied der Programmdatei nicht anzeigen, sodass ich nur den Artikel geändert habe. *** ***

Datei

main.c: ~~ global ~~ ~~ Deklaration der Variablen num ~~ A und B *** in Definition und Reihenfolge (sowohl A als auch B sind externe Funktionen. Überprüfen Sie, ob die Variable extern definitiv global ist) ** * Prozess *** (Addition) main.h: Deklarieren Sie die Variable num mit extern. In anderen c-Dateien wird die Variable num durch Einschließen dieses Headers global. *** *** A.h: ~~ Deklariert die Verwendung der globalen Variablen num ~~ Deklariert die extern zu verwendende Funktion A. A.c: *** main.h einschließen und *** num in Ausgabe ändern (globale Variable num wird geändert) B.h: ~~ Deklariert die Verwendung der globalen Variablen num ~~ Deklariert die externe Verwendung der Funktion B. B.c: *** main.h einschließen und ausgeben, ohne *** num zu ändern (Ausgabe der globalen Variablen num in A geändert)

In der obigen Datei kann die in main deklarierte num von A und B verwendet werden (da sie zu einer globalen Variablen wird), und selbst wenn num in A geändert wird, ist bewiesen, dass die Änderung auch von B bestätigt werden kann.

Der Inhalt der Datei

main.c


#include"main.h"
#include"A.h"  //So verwenden Sie die Funktion von A.
#include"B.h"  //Um die Funktion von B zu verwenden

int num;   //Variablen deklarieren

int main(int argc, char *argv[]){
    A();   //Ändern Sie num in einer anderen Datei
    B();   //Überprüfen Sie andere Dateien auf geänderte Nummern
    return 0;
}

main.h


extern int num;  //Andere Dateien (hier ist main.Dies bedeutet, dass num in c) definiert ist.

A.h


extern void A();  //A.Funktion A, definiert in c, wird in extern zur externen Verwendung deklariert

A.c


#include<stdio.h>
#include"A.h"
#include"main.h"  //Wo num global wird

 void A(){
     num = 10;   //Globale Variablen ändern
     printf("inside A, num = %d\n", num);   //Globale Variable und Ausgabe ändern
 }

B.h


extern void B();  //B.Die in c definierte Funktion B wird zur externen Verwendung in extern deklariert

B.c


#include<stdio.h>
#include"B.h"
#include"main.h"  //Wo num global wird

void B(){
    printf("inside B, num = %d\n", num);   //Ausgabe ohne Änderung globaler Variablen
}
#Erstellen Sie eine gemeinsam genutzte Bibliothek für A.
[pirlo@centos8 02]$ gcc -shared -o libA.so -c A.c
#Erstellen Sie eine gemeinsam genutzte Bibliothek für B.
[pirlo@centos8 02]$ gcc -shared -o libB.so -c B.c
#Kompilieren Sie den Hauptprozess und erstellen Sie eine ausführbare Datei
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#Dateiliste
[pirlo@centos8 02]$ ls
A.c  A.h  B.c  B.h  libA.so  libB.so  main  main.c  main.h

Ausführungsergebnis


[pirlo@centos8 02]$ ./main 
inside A, num = 10   #Ändern Sie die globale Variable mit A.
inside B, num = 10   #Überprüfen Sie die globalen Variablen, die von B nach A geändert wurden

*** Nachtrag ***

https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

*** Gemäß diesem Artikel unterscheiden sich Funktionen von Variablen, und wenn sie kompiliert werden, behandelt der Compiler sie so, als ob sie externe Elemente hätten, sodass Sie anscheinend keine externen Elemente angeben müssen. Als ich es tatsächlich getestet habe, konnte ich es kompilieren und ausführen, selbst wenn ich #include "A.h" und #include "B.h" aus main.h gelöscht habe. *** ***

Recommended Posts

Deklaration globaler Variablen der C-Sprache
Die Geschichte der Manipulation globaler Python-Variablen
Sturz, Python Global Declaration
Globale und lokale Variablen 2
Globale und lokale Variablen 1
Achten Sie auf globale Variablen außerhalb von lambda_handler (datetime)
Fortschritt der 5/6 ~ C-Anordnung usw. ~
Globalisierung von Klasseninstanzvariablen
ARC067 C - Faktoren von Factorial
[Linux] [C / C ++] Operation prüft Memo von Fork, Thread und Thread-lokalen Variablen
Initialisierung globaler Variablen mit Python-Dekoratoren
Verwendung globaler Variablen in Python-Funktionen
Implementierung von c / c ++> RingBuffer (N Ränder)