Programm-Aufruf-Parameter werden vor Übergabe an main irgendwie verfälscht (MinGW)



  • Hallo, ich habe ein für mich nicht erklärbares Phänomen bei der Parameterübergabe beim Aufruf meines Konsolen-Programms (C++), wenn ich es mit MinGW 7.3.0. erstelle und laufen lasse.
    Wenn ich mein Programm, kompiliert mit MinGW, mit Wildcard im Parametern aufrufe, wird dieser nicht einfach übergeben wie z.B. bei "MS C++", oder "GCC" bzw. "Clang" unter Linux, sondern es wird interpretiert. Soll heißen, dass alle Dateien und Verzeichnisse im Aufrufverzeichnis als einzelne Parameter übergeben werden. Wenn ich also 10 Dateien im Verzeichnis habe, bekomme ich 11 Parameter (die einzelnen Datei- und Verzeichnisnamen) ins main geliefert.
    Aufruf:

    MeinPrg "*.*".
    

    Main sieht so aus:

    int main(int argc, char *argv[])
    

    argc ist dann 11 und in argv[] sind zum aufgerufenen Programm alle Dateien aus dem Verzeichnis.

    Wenn der Aufruf:

    MeinPrg "A*.*"
    

    Wird nur der erste Treffer als Parameter, z.B. der vorhandene Dateiname "ABC.txt" als Parameter übergeben, auch wenn es noch eine Datei "ABCNaechsteDatei.txt" geben sollte.
    Erwarten würde ich wie bei den anderen Compilern, dass ein Parameter mit Wildcards als einzelner Parameter eintrudelt.

    Ich kann nur hoffen, dass ich das irgendwo abschalten kann, ansonsten würde MinGW für mein Projekt gar nicht nutzen können.

    Kann mir einer ggf. auf die Sprünge helfen?



  • In Problems with expanding wildcards to a program steht:

    To add to the confusion, the MinGW runtime startup contains code to expand wildcards, as a compatibility aide. Note that the runtime ships with the additional CRT_noglob.o object which you can link into your application to disable this.

    sowie:

    As both Greg and Brian have noted, the solution to the OP's problem is not to patch the runtime start-up objects, but to explicitly add an instantiation for the global variable

    int _CRT_glob = 0;

    either directly in your own source, (in the file which defines the main() or the WinMain() function would be a good choice)...

    Und falls das nicht hilft, aus welcher Shell (Terminal) heraus rufst du dein Programm aus?



  • Hi @Th69,
    danke für die schnelle Info, werde mich damit beschäftigen und bei Erfolg Rückmeldung geben. Kann aber etwas dauern, weil ich grad etwas anderes tun muss.

    Ich benutze in dem Fall die Windows Konsole (Windows 10)



  • Hallo @Th69,

    Die globale Variable (vor der main)

    int _CRT_glob = 0; 
    

    hat geholfen, danke!


Log in to reply