2010-10-19 16 views
8

Se ho un file C foo.c e mentre ho dato -DMACRO=1 come opzione da riga di comando per la compilazione. Tuttavia, se all'interno del file di intestazione ho anchePrecedenza di -D MACRO e #define MACRO

#define MACRO 2 

Quale di questi avrà la precedenza?

+8

Cosa è successo quando l'hai provato? –

risposta

1

manuale dice: prima tutti -D e -U vengono valutate in ordine e poi tutti -Include (ai sensi della sezione D)

migliore dei modi: provare.

4

Le definizioni vengono memorizzate per essere visualizzate dal compilatore e quando il compilatore rileva una nuova macro con lo stesso nome, sovrascrive la macro precedente con quella nuova (almeno questo è il caso in gcc). GCC ti darà anche un avvertimento quando questo accadrà.

4

Otterrai un errore per la ridefinizione delle macro. Ovviamente -D viene definito per primo (prima che il file di origine sia analizzato anziché dopo) o non avrebbe alcun senso. Lo #define è quindi una ridefinizione.

7

Le opzioni della riga di comando si applicano prima di qualsiasi riga letta da un file. I contenuti del file si applicano nell'ordine scritto. In generale, si otterrà almeno un avvertimento se una macro viene ridefinita, indipendentemente dal fatto che la riga di comando sia coinvolta. L'avviso può essere messo a tacere se la ridefinizione non ha importanza, forse perché entrambe le definizioni sono identiche.

Il modo giusto per rispondere a una domanda come questa è costruire un piccolo test case e provarlo. Ad esempio, in q3965956.c inserire il seguente:

#define AAA 2 
AAA 

ed eseguirlo tramite il preprocessore C, magari con gcc -E:

 
C:>gcc -DAAA=42 -E q3965956.c 
# 1 "q3965956.c" 
# 1 "" 
# 1 "" 
# 1 "q3965956.c" 
q3965956.c:1:1: warning: "AAA" redefined 
:1:1: warning: this is the location of the previous definition 

2 

C:> 

Si può vedere dall'output che la macro espansa al valore dato dallo #define nel file. Inoltre, è possibile vedere dalla sequenza delle direttive # che le definizioni incorporate e la riga di comando sono state elaborate prima di qualsiasi contenuto della riga 1 di q3965956.c.

5

Sto facendo un presupposto di quello che stai facendo, ma se vuoi per la fornitura dalla riga di comando un valore non predefinito per quella macro, provate questo per la definizione della macro:

#ifndef MACRO 
#define MACRO 2 
#endif 

In questo modo se la MACRO è già stata definita (tramite il parametro della riga di comando) non verrà né ridefinita né causata da un errore.