2009-08-27 3 views
4

:gcc 3.3 이상에서 __func__을 사용할 수 있습니까? (C++) 3.3 전, 나는 다음과 같은 매크로를 사용하는 MS 컴파일러와 GCC 버전

DEBUG_WARNING(...) printf(">WARNING: "__FUNCTION__"() " __VA_ARGS__); 

사용 :

DEBUG_WARNING("someFunction returned %d", ret); 

출력 :

>WARNING: Class::FunctionName() someFunction returned -1 

그것의 매우 편리합니다 우리는 많은 시스템을 가지고 있으며, 모든 출력을 전송합니다. 출력을 적절하게 필터링 할 수있는 단일 행 매크로. 작은 코드, 큰 사용, 행복한 나를.

__FUNCTION__ (및 C++의 경우 __func__) 정의가 변경되어 (표준 준수를 위해) 매크로가 작동하지 않게되었습니다.

저는 문자열을 직접 작성하는 함수를 사용하고 있지만 매크로가 마음에 들었습니다.

Gcc 3.3에서이 간단한 한 줄 매크로를 사용하는 쉬운 방법이 없습니까?

: D

답변

5

__FUNCTION____func__ 이후는 전처리 문자열 리터럴 연결에 사용할 수 없습니다, 미리 정의 된 식별자가 아닌 리터럴 문자열입니다. 하지만 printf 형식으로 사용할 수 있습니다. 또한 __func__ 사이의 쉼표와 가능한 0 인수 사이의 문제를 해결하기 위해 GNU 스타일 가변 인수 매크로 인수를 사용하려면 __VA_ARGS__ 대신 ##args을 사용하십시오. 약간의 수정과 함께, 치료를 작동

#define DEBUG_WARNING(fmt, args...) \ 
    printf(">WARNING: %s() " fmt "\n", __func__, ##args) 
+0

:'의 printf ("> 경고 : % s의()"FMT는, 기능, VA_ARGS)'쉼표 나에 짓고 있어요 플랫폼에 필요합니다. 도와 주셔서 감사합니다! : D –

+1

## 트릭에 대한 조언 주셔서 감사. 두통없이 완전히 매크로를 독립적으로 만들 수 있습니다. 이것은 나의 최종 매크로가 보이는 방법이다 : '#define DEBUG_WARNING (fmt, ...) printf ("WARNING % s()"fmt, __FUNCTION__, ## __VA_ARGS__), ' 이것은 GCC 4.1에서 정상적으로 컴파일된다. 1 및 다른 2 플랫폼에서 사용되는 Microsoft 컴파일러도 포함됩니다. –

관련 문제