Erstellen Sie ein externes Zeichenarray in C

Lesezeit: 3 Minuten

Benutzeravatar von SMUsamaShah
SMUsamaShah

Wie erstelle ich ein externes Zeichenarray in C?

Ich habe versucht, verschiedene Arten zu definieren char cmdval[128] aber es heißt immer undefined reference to 'cmdval'

Ich möchte eine Zeichenfolge in cmdval einfügen first.c Datei und verwenden Sie es in anderen second.c Datei. Ich habe versucht, a hinzuzufügen global.h Datei mit extern char cmdval[128] aber kein Glück.

AKTUALISIEREN:

global.h

extern char cmdval[128];

zuerst.c

#include "global.h"

char cmdval[128];

function(){
   strcpy(cmdval, "a string");
}

zweite.c

#include "global.h"

function(){
   printf("%s \n",cmdval); //error
}

FAIL 🙁 “undefinierter Verweis auf `cmdval'”

BEARBEITEN: Ich arbeite unter Linux (bearbeite ein Mini-Betriebssystem xv6, kompiliere es und führe es in qemu aus), ich weiß nicht, ob es ein Hindernis ist

  • Sind Sie sicher, dass Sie beide Dateien kompilieren und miteinander verknüpfen? Sind Sie sicher, dass beide Dateien vorhanden sind? .c oder .cpp, keine Mischung aus beidem? Tust du eigentlich #include "global.h" in second.c?

    – Alexey Frunze

    6. Oktober 2011 um 6:19 Uhr

  • Ich habe es noch einmal überprüft und bin mir sicher, dass beides der Fall ist .cbeide `#include “global.h”, aber nicht sicher, ob beide verlinkt werden sollen.

    – SMUsamaShah

    6. Oktober 2011 um 6:32 Uhr

  • Wie genau kompilieren und verknüpfen Sie diesen Code?

    – Alexey Frunze

    6. Oktober 2011 um 6:40 Uhr

  • @Alex – gcc first.c second.c -o main aber sein Beispiel ist unvollständig, schauen Sie sich das Beispiel in meiner Antwort an

    – Geoffrey

    6. Oktober 2011 um 6:44 Uhr


Benutzeravatar von Geoffrey
Geoffrey

Sie müssen es in der .h-Datei deklarieren

extern char cmdval[128];

Und dann definieren Sie den Wert in first.c;

char cmdval[128];

Dann hat alles, was Ihre .h-Datei enthält, Zugriff darauf, vorausgesetzt, es ist mit first.o verknüpft.

Um es genauer auszudrücken, “extern” sagt, dass es eine externe Variable gibt, auf die dies verweist … wenn Sie dann nicht irgendwo cmdval deklarieren, wird cmdval niemals existieren und die externe Referenz wird niemals auf irgendetwas verweisen.

Beispiel:

global.h:

extern char cmdval[128];

first.c:

#include "global.h"
char cmdval[128];

int main() {
  strcpy(cmdval, "testing");
  test();
}

zweite.c:

#include "global.h"

void test() {
  printf("%s\n", cmdval);
}

Sie können dies kompilieren mit:

gcc first.c second.c -o main

Oder erstellen Sie zuerst die .o-Dateien und verknüpfen Sie sie

gcc -c first.c -o first.o
gcc -c second.c -o second.o
gcc first.o second.o -o main

  • ‘sofern es mit first.o verlinkt ist’ was bedeutet das?

    – SMUsamaShah

    6. Oktober 2011 um 6:21 Uhr

  • Muss ich auch char cmdval in second.c definieren?

    – SMUsamaShah

    6. Oktober 2011 um 6:21 Uhr

  • Sie sind Teil derselben Binärdatei, zB: gcc first.c second.c -o mainund nein, Sie deklarieren cmdval nur einmal, aber Sie brauchen immer noch das extern in global.h

    – Geoffrey

    6. Oktober 2011 um 6:22 Uhr


  • Nehmen Sie die 128 aus der extern-Deklaration. extern char cmdval[] reicht. Wenn Sie einen Wert in der Deklaration belassen und die Definition geändert wird, wird der Wert der Deklaration ignoriert.

    – Eran

    6. Oktober 2011 um 6:24 Uhr

  • Ich arbeite unter Linux (bearbeite ein Mini-Betriebssystem xv6, kompiliere es und führe es in qemu aus), ich weiß nicht, ob es ein Hindernis ist

    – SMUsamaShah

    6. Oktober 2011 um 6:30 Uhr

Extern bedeutet nicht, es irgendwo zu finden, es ändert die Variable linkage zu externalwas bedeutet, egal wie oft Sie eine Variable deklarieren, sie verweist auf dasselbe.

zB Diese Verweise auf dasselbe in c (nicht c++), die Verknüpfung einer globalen Variable ist standardmäßig external.

external char cmdval[128];
char cmdval[];
char cmdval[128];

Das Problem ist, dass Sie sie zuerst in .o kompilieren und dann diese .o miteinander verknüpfen sollten.

gcc -c first.c second.c
gcc -o first.o second.o

oder

gcc first.c second.c

Sie sollten eine Kompilationseinheit haben, in der Sie definieren das cmdval Variable. Das extern Stichwort erklärt nur dass die Variable existiert, definiert sie nicht.

Trage die folgende Zeile ein first.c, second.c oder in einer anderen C-Datei Ihrer Wahl:

char cmdval[128];

Im second.c

#include "global.h"

definieren extern char cmdval[128] in global.h auch.

1433360cookie-checkErstellen Sie ein externes Zeichenarray in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy