2010-10-03 16 views
0

Où est-ce que je me trompe? Je veux définir une valeur de préprocesseur sur la ligne de commande pour g ++ mais elle échoue. Ci-dessous un exemple de code qui répliquent mon problème:Ne compile pas avec une valeur de préprocesseur sur la ligne de commande

[modifier] J'utilise:
g ++ (Debian 4.3.2-1.1) 4.3.2
GNU Make 3,81

test.h

#ifndef _test_h_ 
#define _test_h_ 

#include "iostream" 

#if defined(MY_DEFINED_VALUE) 
#if (MY_DEFINED_VALUE != 5) 
#undef MY_DEFINED_VALUE 
#define MY_DEFINED_VALUE 3 
#endif //(MY_DEFINED_VALUE != 5) 
#else //defined(MY_DEFINED_VALUE) 
#error Error - MY_DEFINED_VALUE is not defined 
#endif //defined(MY_DEFINED_VALUE) 

class test 
{ 
public: 
int val; 
test() {} 
void show() { std::cout << "val = " << val << "\n"; } 
}; 

#endif //_test_h_ 

test.cpp

//#define MY_DEFINED_VALUE 5 
#include "test.h" 

int main() 
{ 
    test t; 
    t.val = MY_DEFINED_VALUE; 
    t.show(); 
    return 0; 
} 

Makefile

#===== 
CC = g++ 
LD = g++ 
USERDEFINES = -DMY_DEFINED_VALUE 
CFLAGS = -Wall 
LDFLAGS = 
RM = /bin/rm -f 
SRCS = test.cpp 
OBJS = test.o 
PROG = test 
#===== 
$(PROG): $(OBJS) 
$(LD) $(LDFLAGS) $(OBJS) -o $(PROG) 
#===== 
%.o: %.c 
$(CC) $(USERDEFINES) $(CFLAGS) -c $< 
#===== 
clean: 
$(RM) $(PROG) $(OBJS) 

Si je ne commente pas le #define dans test.cpp, tout va bien (imprime 5). Si je le commente, j'obtiens le #error.

+0

L'appel 'g ++ -DMY_DEFINED_VALUE x.cpp' fonctionne directement. (imprime 3). – kennytm

+0

@KennyTM: C'est ce que je fais dans le Makefile - cela voudrait dire que mon compilateur g ++ est corrompu (difficile à croire). – slashmais

+0

Ou peut-être votre makefile est faux. Avez-vous essayé de faire 'g ++ -DMY_DEFINED_VALUE test.cpp' directement dans la ligne de commande? – kennytm

Répondre

6

Le problème est dans votre Makefile. La règle %.o: %.c ne correspond pas à un fichier .cpp, donc la règle intégrée %.o: %.cpp de GNU Make est déclenchée à la place. Si vous changez %.o: %.c en %.o: %.cpp, il fonctionnera correctement.

+1

Aaaah ..! maintenant je me sens si petit et stupide! Merci. Dommage que quelque chose de si bête puisse causer tant de frustration et perdre autant de temps. – slashmais

+0

Ouais, les petites choses comme ça sont les plus agaçantes. Ça arrive aux meilleurs d'entre nous. La seule raison pour laquelle je l'ai remarqué est que j'ai ajouté un "écho" juste avant l'appel à $ (CC), puis j'ai été troublé lorsque l'écho ne s'est pas affiché dans la sortie. – Jander

+0

À la fin de celui-ci est: Je sais maintenant beaucoup plus sur les commandes du préprocesseur C++ que ce que je faisais avant ce petit hoquet;) – slashmais