2016-04-18 5 views
0

Ich versuche, ein Shell-Skript zu schreiben, das mehrere Tests meines C++ - Programms ausführen wird, wobei jedes Mal ein Makro neu definiert wird, wenn es ausgeführt wird. Ich versuche, die -D Name Preprozessor-Option zu verwenden (siehe https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html), aber ich bekomme ständig die Warnung, dass das Makro neu definiert wird, und dann das Programm ausgeführt wird, ohne es neu zu definieren.Verwenden der -D-Kompilierungsoption aus einem Shell-Skript

Mein Skript ist wie folgt:

#!/bin/bash 

#NUMS is number of subdivisions: 
for subdiv in 10 100 500 1000 
do 
    echo NUMS = $subdiv 
    g++ -D NUMS=$subdiv project01.cpp -o project01 -lm -fopenmp 
    ./project01 >> bezier_results.txt 
done 

In meiner C++ Datei, project01.cpp, ich feststellen:

#define NUMS 1 

Ich habe versucht, die '1' auszulassen, aber das erzeugt Fehler auch. Es ist klar, dass das Skript das Makro nicht wirklich neu definiert. Irgendwelche Gedanken? Vielen Dank!

+0

Es ist genau das, was die Warnung sagt, Sie definieren es neu. Sie haben es einmal in der Befehlszeile und erneut in der Datei definiert. Wenn Sie es über die Befehlszeile _override_ wollen, umgeben Sie die Definition in Ihrer Quelle innerhalb eines '#ifndef NUMS' /' # endif'-Paares. Es ist klar, dass das Skript das Makro nicht wirklich neu definiert - Sie haben Recht. Die Neudefinition erfolgte in Ihrer '#define NUMS 1' Quelle. Die Befehlszeile wurde zuerst angezeigt. – mah

Antwort

1

Durch Definieren des Makros in der Befehlszeile mit -DNUMS=100 haben Sie einen Standardwert angegeben.

Sie sind Code überschreibt dann den Standardwert, wenn Sie tun:

#define NUMS 1 

Die Compiler Warnung Ihnen genau sagt, was passiert ist. Stattdessen betrachtet so etwas wie diese Codierung:

#if !defined NUMS 
#define NUMS 1 
#endif 

Jetzt ist der Compiler nur NUMS als 1 neu definieren, wenn es noch nicht definiert worden

(dh an anderer Stelle in Ihrer Quelle, oder in diesem Fall der Befehlszeile.)
Verwandte Themen