Frage

Ich bin es auf diese Weise tun:

int argc = 9;
char* argv[argc];

argv[0] = "c:/prog.exe";

aber ich bemerkt, dass es veraltet ist. Was ist besser Weg?

War es hilfreich?

Lösung

Sie müssen entweder machen const:

const char *argv[] = { "Arg1", "Arg2", "..." };

... oder auch nicht verwenden, die konstanten Stringliterale:

int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;

Andere Tipps

Neben dem Problem von etwas anderes als ein konstanten Ausdruck für Array-Größe mit ...

Die Sache, die veraltet ist, ist die stille Gießen von Stringliterale zu char*. Dies wird verwendet, um in Ordnung sein:

char * hello = "hello";

Jetzt muss es sein:

char const* hello = "hello";

Dieses deprecation ist eigentlich in einem Anhang in C ++ 03.

Lassen Sie uns analysieren, was machst du hier:

// Create an int with value 9.
int argc = 9;

// Create an array of char* pointers of size 9
char* argv[argc];

// Assign the the first pointer to the global data string "C:\prog.exe"
argv[0] = "c:/prog.exe";

Meine Vermutung ist, dass Sie nicht versuchen zu tun, was ich oben beschrieben. Probieren Sie etwas wie folgt aus:

// create an array of characters
char argv[] = "C:/prog.exe";

// argc in now the length of the string
int argc = sizeof argv;

-oder -

// create an array of strings
char* argv[] = {"C:/prog.exe"};
// argc is now the number of strings in the array
int argc = 1;

Versuchen const mit, um anzuzeigen, dass die Saiten nicht geändert werden.

const char* argv[] = { "c:/prog.exe" };
const int argc = sizeof(argv) / sizeof(argv[0]);

int main()
{
    for(int i = 0; i < argc; ++i)
    {
        ::printf("%s\n", argv[i]);
    }
}

Hier argc wird automatisch auch so bei der Kompilierung berechnet werden gibt es eine geringere Chance auf Fehler (dank Goz für den Vorschlag).

1 für Vlad.

Einige weitere Erklärung von mir auf, was passiert hier:

Sie erhalten die "veraltet" Warnung, weil ein solcher Code:

"asdf"

hat jetzt Typ const char*, nicht char*. Und Stringliterale können char* umgewandelt werden, eine gewisse Kompatibilität mit den älteren Konventionen zu halten, wenn const nicht so streng war. Aber Umwandlung eines Stringliteral zu char* von const char* ist veraltet und Sie sollten nicht auf sie verlassen.

Warum? Stringliteral ist ein Zeiger auf konstante Erinnerung, deshalb braucht es const char* zu sein.

Andere als das, was alle anderen über const Stringliterale hingewiesen hat zu nicht-const char Zeiger und die Seltsamkeit zu erklären argv und argc außerhalb von main () 's Parameterliste, dort zugewiesen wird, ist ein zusätzliches Problem mit dieser Linie hier :

char* argv[argc];

Sie können nur ganzzahlige Konstante Ausdrücke für Feldgrößen in C ++ verwenden; ein ganze Zahl konstanter Ausdruck eine wörtliche ganze Zahl in der Quelle des Programms (wie „5“ oder „10“) ist, ein Aufzählung Wert (wie „red“ von „ENUM Farben {rot, grün, blau};“), ein sizeof Ausdruck oder eine int Variable deklariert mit const:

// can hold 30 ints
int myarray1[30];

// can hold as many ints as myarray1 is wide in bytes
int myarray2[sizeof(myarray1)];

// C++ does not support variable-length arrays like C99 does, so if an int
// variable is used to specify array size, it must be marked const:
const int myarray3_size = 42;
int myarray3[myarray3];

Viele C ++ Compiler implementieren C99-Stil Arrays variabler Länge, so dass Sie keine Beschwerde erhalten können, wenn Sie sie verwenden, aber sie sind immer noch am besten vermieden werden, wenn Sie portablen Code schreiben möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top