2014-04-19 3 views
2

하나는 그래서는 configure.ac에 추가 한 코드를 테스트하는()는 프로젝트 디렉토리 /lib/mytest.c에서 파일의

#ifdef TEST 
int main(int argc, char *argv[]) 
#endif 

테스트 목적으로 주요 조건이 포함되어 충돌을 생성 파일

AC_DEFINE(TEST, 1,[My description for TEST]) 

mytest.h가 포함 된 다른 파일이 있습니다. 내가 autoreconf을하려고하면 다음 ./configure를 다음 내가 GCC에 다음과 같은 오류가 발생합니다

multiple definition of `main' 

mytest.h 포함 파일이 또한 그들의 주요 기능을 가지고 있기 때문에 이것은 이해할 수있다. 테스트 목적으로 독립형 mytest 프로그램을 갖고 싶습니다.

프로젝트를 어떻게 작성합니까? Configure nad Make files에서 변경해야 할 사항은 무엇입니까?

감사합니다.

+0

'.......... mytest.h를 포함한 파일도 main 함수를 가지고 있기 때문에'헤더 파일'mytest.h'에는'main' 함수도 포함되어 있습니까? 나는 그것을 이해하지 못한다. –

+0

아니요 mytest.h는 include 폴더에 있으며 주를 포함하지 않습니다. mytest.h를 포함하는 다른 소스 파일이 있습니다. –

+0

다른 파일 (다른 'mytest.c')에있는 다른 주요 기능이 맞습니까? 그렇다면 어떤 조건이 참이라면'main'을 가능하게하는 조건을 넣으십시오. –

답변

0

일반적으로 tdesrt 드라이버를 허용하기 위해 main을 정의하기 위해 ifdefs를 추적하면 지루하고 지루하고 오류가 발생하기 쉽습니다.

덧글에 따르면 을 다른 .c 개의 파일에 main을 추가하고 동일한 파일을 포함하여 TEST을 정의 할 수 있습니다. 그러나 세 번째 또는 그 이상의 테스트 드라이버가 있다면 어떻게 될까요?

내가 채택한 해결책은 간단하다, 항상 하나의 main을 가지고 있지만 그것은 당신의 테스트가 main_test1 할 수있는 정규 주요 기능은 main_program미터 호출 할 수 있습니다 예를 들어 주요 호출되지 않은 다른 main 기능 및 작은 측에 전화했다 테스트는 main_test_tiny_func 일 수 있습니다. 의도를 명확히하기 위해 일반적으로 모든 psudo-main 함수에 접두어를 붙입니다. main_

가끔씩 사용하려는 의사 메인을 전환하기 위해 주석을 사용했으나 엉망이되었습니다.

main.c를

int main(int argc, char *argv[]) 
{ 
#ifdef TEST1 
    return main_test1(argc, argv); 
#else 
#ifdef TINY_TEST 
    return main_test_tiny_func(argc, argv); 
#else 
    return main_program(argc, argv); 
#endif 
#endif 
} 

다른 방법으로 당신은 당신이 많은 테스트

#ifndef TEST_TO_RUN 
#define TEST_TO_RUN 0 
#endif 

int main(int argc, char *argv[]) 
{ 
    switch(TEST_TO_RUN) 
    case 2: 
      return main_test1(argc, argv); 
    case 1: 
      return main_test_tiny_func(argc, argv); 
    case 0: 
      return main_program(argc, argv); 
    } 
} 

실행하는 런타임에 결정 때때로 유용이있는 경우 실행하는 테스트를 결정하는 매니페스트 상수를 설정할 수 있습니다 (예를 들어 회귀 테스트), 그 경우 위와 같은 스위치를 사용하여 결정할 첫 번째 인수를 먹습니다.

int main(int argc, char *argv[]) 
{ 
    int test_no=atoi(argv[0]); 
    argc--; argv++; 
    switch(test_no) 
    case 2: 
      return main_test1(argc, argv); 
    case 1: 
      return main_test_tiny_func(argc, argv); 
    case 0: 
      return main_program(argc, argv); 
    } 
}