2012-09-24 3 views
0

명령 줄을 통해 프로그램을 실행할 때 부울 매크로의 값을 변경하려면 어떻게해야합니까? 예를 들어, 전화, 내 CPP 파일에 다음 매크로가 있다고 가정 그것은 내 프로그램을 실행할 때C++ 명령 줄 디버그 인수

#define DEBUG 1 

는 어떻게 변경할 수 있습니다 MyCpp.cpp? 명령 줄을 통해 :

g++ -Wall -Wextra -o MyCpp MyCpp.cpp 

나는 어떤 종류의 명령 행 옵션을 지정했는데,이 벨소리는 어떤 종소리인가? 또한, 나는 사용하지 않으 argv[]

+0

'MyCpp.cpp'는 필자가 본 최악의 파일 이름 중 하나 여야합니다. 아마도'class class'와'struct struct_'를 포함하고있을 것입니다. 아마'void myfunction()'에서 호출했을 것입니다. –

+1

아니요,'MyClass'와'MyStruct'를 포함하고 있습니다. 이들은'Cpp.cpp'에서'Class'와'Struct' 주위의 래퍼입니다.:) – abarnert

+0

* compile * time 또는 * execution * time에서 값을 변경 하시겠습니까? – Joe

답변

4

첫째, 소스 코드 변경 :

#ifndef DEBUG 
# define DEBUG 1 
#endif 

지금 명령 행에 말할 수 있습니다 :

g++ -Wall -Wextra -o MyCpp MyCpp.cpp -DDEBUG=5 
#         ^^^^^^^^^ 

-DFOO=bar이이 명령 줄 인수 소스 코드에 #define FOO bar을 넣는 것과 같은 효과가 있습니다. 매크로의 불법적 인 재정의를 피하려면 #ifndef 가드가 필요합니다. 때로는


명은 다른 매크로의 정의을 방지 에 보조 매크로를 사용합니다 ...

#ifndef SUPPRESS_FOO 
# define FOO 
#endif 

// ... later 

#ifdef FOO 
// ... 
#endif 

이제 -DSUPPRESS_FOO-하지 코드에 FOO을 정의라고

+1

너무 빨리 입력하고 있습니다. 적어도 이번에는 끝나기 전에 보았습니다. –

+0

내 매크로에 5라는 값을 부여합니까? – CodeKingPlusPlus

+0

@CodeKingPlusPlus : 맞습니다. –

1

명령 줄을 통해 프로그램을 실행할 때 부울 매크로의 값을 변경하려면 어떻게해야합니까?

그 자체로는 할 수 없습니다. 선행 처리기 기호를 사용하므로 디버그 정보를 인쇄할지 여부를 결정하는 것이 컴파일 타임 결정입니다. 해당 컴파일 타임 디버그 기호를 명령 줄을 구문 분석하거나 런타임에 읽은 일부 구성 파일 또는 두 가지 모두를 통해 설정 한 런타임 변수로 변경해야합니다.

명령 줄 구문 분석이 그리 어렵지 않습니다. 그렇게 할 수있는 저수준 C 스타일 도구가 많이 있습니다. Boost는 훨씬 더 강력한 C++ 기반 스키마를 가지고 있습니다. 트릭은 컴파일 타임 디버그 결정을 런타임 의사 결정으로 변경하는 것입니다. 가장 간단하게, 그리 어렵지 않다 : 단지 DEBUG 전처리 기 심볼을 전역 변수로 대체한다. 물론 이것보다 상당히 정교해질 수 있습니다. 결국 구성 가능한 로깅 시스템을 갖게됩니다. 부스트도 있습니다.

+0

이것은 OP가 아마도 원하는 것처럼 보이는 것이 아니라 OP가 묻는 질문에 대답합니다. 이 또는 Kerrek SB의 대답은 아마도 맞을지 모르겠지만, 둘 중 어느쪽에 +1 할 것인지 잘 모르겠습니다. – abarnert

0

다음 사항에 유의하십시오. 당신이 당신의 C/CPP 파일이나 포함 된 헤더 파일 중 하나에있는 경우 :

#define DEBUG 1 

그런 다음 컴파일러 (메이크)의 명령 줄을 사용하여이 정의를 수정할 수 없습니다. 단순히 기회는 없습니다. cpp 파일은 단순히 명령 행 설정을 겹쳐 씁니다.