>

내 소프트웨어에는 정상적인 사용을위한 메인과 유닛 테스트를위한 메인이 있습니다. gcc가 사용할 "main"기능을 지정하는 옵션이 있다면 좋겠다.

  • 답변 # 1

    파일을 별도의 파일에 넣고, 일반적으로 사용할 수있는 하나의 .c 파일과 테스트를 위해 하나의 .c 파일을 지정하십시오.

    또는 #define  테스트 빌드를 사용하여 명령 줄에서 테스트하고 다음과 같은 것을 사용하십시오.

    int main(int argc, char *argv[])
    {
    #ifdef TESTING
        return TestMain(argc, argv);
    #else
        return NormalMain(argc, argv);
    #endif
    }
    int TestMain(int argc, char *argv[])
    {
        // Do testing in here
    }
    int NormalMain(int argc, char *argv[])
    {
        //Do normal stuff in here
    }
    
    

  • 답변 # 2

    여기서 다른 대답은 상당히 합리적이지만 실제로 말한 문제는 실제로 GCC가 아니라 C 런타임에 관한 것입니다. -e 를 사용하여 프로그램의 진입 점을 지정할 수 있습니다   ld 에 깃발 . 내 문서에는 다음과 같이 말합니다.

    와이즈 비즈 와이즈 비즈

         

    메인 실행 파일의 진입 점을 지정합니다. 기본적으로 항목 이름은 "start"이며 crt1.o에 있으며 글루 코드가 포함 된 main ()을 설정하고 호출해야합니다.

    즉, 원하는 경우 진입 점을 무시할 수 있지만

    이후 시스템에서 정상적으로 실행하려는 C 프로그램에 대해서는 시작점을 원하지 않을 수 있습니다.  프로그램이 실행되기 전에 필요한 모든 종류의 OS 관련 작업을 수행 할 수 있습니다. 자신의 -e symbol_name 를 구현할 수 있다면 , 원하는 것을 할 수 있습니다.

  • 답변 # 3

    Make 또는 이와 유사한 것을 사용하고 있다고 가정합니다. 나는 main 함수의 다른 구현을 포함하는 두 개의 파일을 만든 다음 makefile에서 하나는 "unit test main"을 사용하고 다른 하나는 "normal main"을 제외하고 나머지 파일에 대해 동일한 종속성을 갖는 두 개의 별도 대상을 정의합니다. ". 다음과 같은 것 :

    start
    
    

    "normal"타겟이 makefile의 상단에 가까이있는 한 "make"를 입력하면 기본적으로 선택됩니다. 테스트 대상을 만들려면 "make unittest"를 입력해야합니다.

  • 답변 # 4

    매크로를 사용하여 하나의 함수 이름을 main으로 바꿀 수 있습니다.

    start
    
    

  • 답변 # 5

    다른 파일을 사용하고 테스트 및 프로덕션 빌드에 사용하는 경향이 있지만 파일이 있으면

    normal: main_normal.c file1.c file2.c
    unittest: main_unittest.c file1.c file2.c
    
    

    그리고

    #ifdef TESTING
    #define test_main main
    #else
    #define real_main main
    #endif
    int test_main( int argc, char *argv[] ) { ... }
    int real_main( int argc, char *argv[] ) { ... }
    
    

    그런 다음 메인을 선택하는 컴파일러 옵션은 int test_main (int argc, char*argv[]) 입니다.  그리고 int prod_main (int argc, char*argv[])

    -Dtest_main=main

관련 자료

  • 이전 geolocation - Bing 또는 Google Maps API를 사용하여 사용자 위치 (위도, 경도) 얻기
  • 다음 angularjs - firebase admin SDK는 사용자를 생성하고 확인 이메일을 보냅니다