내가이 프로그램의 헤더 파일이 어딘가에,이를 지원하기 위해
#define fooco_assert(expr) \
((void) ((expr) || \
fooco_assert_failed(#expr, __FILE__, __LINE__, function_name)))
extern int fooco_assert_failed(const char *expr, const char *srcfile,
int lineno, const char *fnname);
같은 사용자 정의 assert
매크로 독서 뭔가를 포함하는 것으로 의심, 저자는 상기 function_name
의 정의가 될 것이라고 그에게 스타일 규칙을 만든 모든 단일 기능의 시작으로 나중에 function_name
을 사용할 수 있는지 여부를 고려하지 않고도 필요에 따라 fooco_assert
에 전화를 추가 할 수 있습니다. 아시다시피 컴파일러는 실제로 사용되지 않는 한 컴파일 된 프로그램에 문자열을 전송하지 않으므로 효율성 문제가 아닙니다.
확실히 은입니다. 그래도 프로그램을 읽고 편집하는 데 속도 위반이 있습니다. C++ 11 컴파일러는 현재 함수의 이름을 가지고있는 미리 정의 된 변수 __func__
을 제공합니다. 이 대신 사용할 수 있습니다. 이 기능은 1999 년에 C 표준에 추가되었으며 많은 C++ 컴파일러가이를 거의 즉시 채택했습니다. 다른 C++ 컴파일러에는 __func__
이 없지만 이에 상응하는 독점 확장명을 사용합니다. __FUNCTION__
. 이들은 이 아니고 매크로 여야합니다.
#ifndef __func__
#define __func__ "<unavailable>"
#endif
__func__
을 사용할 수 있는지 여부를 감지하지 못합니다.
#if __cplusplus >= 201103L || __GNUC__ >= 3
// __func__ is available in C++11, and in GCC >= 3.0
#elif _MSC_VER || __GNUC__
// pre-C++11 MSVC and ancient versions of GCC call this
// feature __FUNCTION__ instead
#define __func__ __FUNCTION__
#elif ...
// ... etc etc for all other compilers you care about
#else
#define __func__ "<unavailable>"
#endif
이이 일반적인 사용 곳의 예를 보여줄 수 : 대신 (내 머리 위로 떨어져, 모든 테스트하지)이 같이해야 할 것이다? 아마도 오픈 소스 프로젝트에 링크되어 있습니까? 이 작업은 ** 로깅을 위해 ** 사용되는 경우에만 수행 된 것으로 보아서 로그가없는 작은 함수에 여전히 존재하는 경우가 있습니다. – BoBTFish
그 질문에 대답을 할 수있는 사람 만 대답 할 수 있습니다 (디버깅 도움이 될 것 같거나 존재하는 매크로와 관련이 있습니다). –
@BoBTFish 불행히도 이것은 독점 코드입니다. "__FUNCTION__"과 같이 인쇄되는 디버그 매크로를 검색했지만 아무 것도 없습니다. 사용되지 않기 때문에 컴파일러는 O1 자체에서 완전히 자신감을 가지고 제거했습니다. 코드에서 작업하는 다른 모든 사람들은 같은 문화권을 따르고 있습니다 * –