2010-01-19 4 views
4

gcc 4.4.2 c89크로스 컴파일 매크로 이름

다음 코드가 있습니다.

#if defined (__linux__) 
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
     strerror(errno), __func__, __LINE__); 

#elif (WIN32) 
    log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
     strerror(errno), __FUNCTION__, __LINE__); 
#endif 

나는 그들이 함수 이름을 기능FUNC를 얻기 위해 다른 매크로를 사용할 때 위와 log_msg되어 분리가 모두 윈도우와 리눅스에서 컴파일하고 있기 때문에.

그러나 나는이 많은 log_msg를 써야하며 어쨌든 하나의 매크로를 만들기 위해 두 번 쓰지 않아도된다고 궁금한가요?

많은 조언을 주셔서 감사합니다.

답변

5

왜 이런 식으로하지 않으시겠습니까?

#if defined (__linux__) 
    #define FUNC_REF __func__ 
#elif (WIN32) 
    #define FUNC_REF __FUNCTION__ 
#endif 

log_msg(stderr, "Socket failed [ %s ] [ %s ] [ %d ]\n", 
    strerror(errno), FUNC_REF, __LINE__); 

편집 : 당신은 물론 피할의 다른 수를 정의하여 새로운 상수를 사용하여 수있다. (즉, WIN32 조건 #define __func__ __FUNCTION__)

+0

25 형편 초. –

+0

@ 크리스, 좋은 인종. –

+0

감사합니다. 저는 지난 8 년 동안 C를 작성하고 #define을 정의하는 적절한 방법을 찾지 않아도 될 것입니다. –

5

대신에이 솔루션을하고, 나는이 시스템 권장 작업을 사용합니다 GCC 컴파일러가 제안한 것입니다. 기본적으로 다음과 같은 매크로를 정의하고 사방 __func__를 사용

#if __STDC_VERSION__ < 199901L 
# if __GNUC__ >= 2 
# define __func__ __FUNCTION__ 
# else 
# define __func__ "<unknown>" 
# endif 
#endif 

참조 : 동일한 답변을 http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html

관련 문제