2013-06-05 3 views
0

어리석은 질문이 있을지 모르지만 어리석은 질문을 드리겠습니다 ... 파일 matrix.hppmatrix.cpp이 있다고 가정 해 봅시다. 그 파일에서 나는 어떤 조건이 존중되는지 확인하기 위해 assert(...)을 사용합니다. 이 파일을 컴파일하고 matrix.o 파일을 만듭니다. 이제 나는 많은 다른 프로그램에서이 matrix.o 파일을 사용할 것입니다. 그 중 일부는 테스트 일 뿐이므로 assert(...) 조건을 확인해야하고, 다른 프로그램은 이러한 검사가 필요없는 프로그램을 작동하고 있습니다.C++ 연결 및 컴파일 플래그

내 질문은 : -DNDEBUG 플래그없이 matrix.o을 컴파일 할 수 있습니까? 따라서 일반적으로 assert(...) 조건이 검사됩니다. 그러나 내가 체크를 필요로하지 않는 프로그램을위한 .o 파일을 링크 할 때 나는 matrix.o 파일을 다시 컴파일하지 않고이 플래그를 추가한다. 확인 답변에 감사드립니다

# the test program with the "assert(..)" checks  
test:test.o matrix.o 
    gcc -o [email protected] $^ 
test.o:test.cpp matrix.hpp 
    gcc -c $^ 

# the real program without the "assert(..)" checks 
prog:prog.o matrix.o 
    gcc -o [email protected] $^ -DNDEBUG 
prog.o:prog.cpp matrix.hpp 
    gcc -c -DNDEBUG $^ 

# the matrix.o that can be either checked or not if the -DNDEBUG flag 
# is given when the .o files are linked 
matrix.o:matrix.cpp matrix.hpp 
    gcc -c $^ 

을 :

이 내가 원하는 것을 할 것, 더 정확하게하려면! 그래서 나는 단순히 플래그 -DNDEBUG를 사용하여 그렇게 할 수 없습니다.

#ifdef CHECK 
assert(...) 
#endif 

와 내가 "테스트"프로그램을 컴파일 할 때 지금은 아니지만 "프로그램"으로 체크 플래그를 사용하면 어떻게 내가 매트릭스 파일에 "(...) 주장"사용할 때마다 내가 추가 프로그램? 나는 그것도 작동하지 않을 것 같아요 ...

+0

내가 관련 있다고 생각하는 두 가지 질문 : http://stackoverflow.com/questions/8035394/gnu-make-how-to-make-conditional-cflags 차례로 http://stackoverflow.com/questions/을 참조하십시오. 5129577/makefile-define-compilation-variables-based-on-target-for/5153406 # 5153406 –

답변

0

짧은 대답은 아니입니다. 정확한 상황에 따라 끌어낼 수있는 몇 가지 똑똑한 트릭이있을 수 있습니다 (예 : 다른 "어설 션 실패"기능에서 링크).

주장하는 대신 예외를 던집니다. 그런 다음 'prog'및 'test'는이를 처리하는 데 다양한 접근 방식을 취할 수 있습니다.

+0

추신 : 분명히 (?), matrix.hpp에 정의 된 함수에서 선언됩니다 (# include-d가 prog.cpp라고 가정). test.cpp)가 원하는대로 작동합니다. – peterpi

+0

감사합니다! 예, 예외를 던지기로 생각하지만 런타임 비용이 증가하기 때문에 그렇게하고 싶지 않습니다 ... – PinkFloyd

0

아니요, GCC가 아닙니다.

  1. matrix.o의 두 가지 버전을 컴파일하고 각 프로그램에 해당하는 버전을 연결하거나
  2. 예외를 throw 수동 검사와 assert 교체 : 나는 두 가지 옵션을 참조하십시오.

후자의 옵션은 분명히 비 테스트 프로그램에서도 약간의 런타임 비용이 있기 때문에 내부 루프 내부가 아닌주의해서 사용하십시오.