2016-08-19 3 views
-4

기능의 첫 번째 줄의 목적은 무엇입니까? 경험이 풍부한 사람들에 의해 설계 코드에서 어떤 매크로를 인쇄하지 위치를 모든 함수의 시작 부분에 상수 문자 포인터가 사용되는 이유는 무엇입니까?

`

void foo::bar() 

{ 

    const char * function_name = "bar"; // <<< WHY?? 

    /* Code */ 

    /* More Code */ 

    /* Waiting for function_name to be used !!!*/ 

    /* Wow it is totally useless?*/ 
    return; 
} 

모든 사용된다. 어떤 트릭을 수행합니까? 기업 코드를 쓰는 사람이, 내가 자주 그런 구조를 보았 듯이 말하기

const char * function_name = "bar"; 
Loggers::get_logger() << "Entered function " << function_name << "\n"; 

:

+2

이이 일반적인 사용 곳의 예를 보여줄 수 : 대신 (내 머리 위로 떨어져, 모든 테스트하지)이 같이해야 할 것이다? 아마도 오픈 소스 프로젝트에 링크되어 있습니까? 이 작업은 ** 로깅을 위해 ** 사용되는 경우에만 수행 된 것으로 보아서 로그가없는 작은 함수에 여전히 존재하는 경우가 있습니다. – BoBTFish

+4

그 질문에 대답을 할 수있는 사람 만 대답 할 수 있습니다 (디버깅 도움이 될 것 같거나 존재하는 매크로와 관련이 있습니다). –

+0

@BoBTFish 불행히도 이것은 독점 코드입니다. "__FUNCTION__"과 같이 인쇄되는 디버그 매크로를 검색했지만 아무 것도 없습니다. 사용되지 않기 때문에 컴파일러는 O1 자체에서 완전히 자신감을 가지고 제거했습니다. 코드에서 작업하는 다른 모든 사람들은 같은 문화권을 따르고 있습니다 * –

답변

2

그것은 하나 개의 시점에서, 함수가이처럼 보였다 코드를 가지고 가능성이 있습니다. 아마도 로깅은 제거되었거나 메타 프로그래밍 템플릿의 일부였습니다. 문자열을 저장하기 위해 const char *을 사용한다고 생각했지만 코드가 꽤 오래된 것으로 추정해야합니다.

어쨌든이 코드는 C++ 특정 디자인 선택 항목이 아니며 확실한 대답을 원한다면 코드를 작성한 특정 사람에게 질문해야합니다.

+0

미리 특정 문자열 리터럴을 사용하지 않고 const char *을 취할 수있는 API에 축 어적으로 전달한 다음 'const char *'변수는 오버 헤드를 제거합니다.만약 하나가 있다면 큰 문제는 아니지만 모든 단일 함수에 대해 하나가 있다면 그것은 필요없는 정적 생성자가 될 수 있습니다. – zwol

3

내가이 프로그램의 헤더 파일이 어딘가에,이를 지원하기 위해

#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 
+0

놀랍게도 __func__은 C++ 11에서만 도입되었습니다! –

+0

@ P.P. C++ 표준은 1999 년 * C *에 추가되었지만 C++ 표준은 1998 년과 2011 년 사이에 사소한 수정 만 받았다. 많은 C++ 컴파일러가 사전에이를 가져 왔거나 동등한 확장을 가졌다. 그것에 대해 뭔가를 추가하겠습니다. – zwol

관련 문제