2016-10-31 4 views
1

함수를 아직 구현하지 않았다는 것을 지정할 수 있도록 매크로를 만들려고합니다. 호출 될 때 프로그램이 중단됩니다. 여기에 내가 무엇을 최대 온의 :함수가 구현되지 않은 매크로입니까?

#define NIMPL crash(__PRETTY_FUNCTION__ " not implemented yet") 

그리고 당신이 그렇게처럼 사용하십시오 : 그러나

void myFunction() { 
    NIMPL; 
} 

, 이러한 사용이 오류가 발생합니다

../feta/include/feta.h:19:41: error: expected ‘)’ before string constant 
#define NIMPL crash(__PRETTY_FUNCTION__ " not implemented yet") 
             ^

crash()는 기능입니다 하나의 문자열을 매개 변수로 받아들이고 메시지를 인쇄하고 exit(1)을 호출합니다.

연결이 잘 작동하지 않고 __PRETTY_FUNCTION__ 만 단독으로 확인할 수 있습니다. 또한 __PRETTY_FUNCTION__없이 두 문자열을 연결하면 정상적으로 작동합니다 : "<stuff>""<other stuff>". 그러나 동시에 둘 다하는 것은 효과가 없습니다.

stringizing operator을 사용해 보았지만 작동하지 않았습니다 (GCC에도 존재하는 경우).

+1

C의 경우'__Punc'_FUNCTION__과 달리'__func__'을 사용할 수도 있습니다. '__PRETTY_FUNCTION__'은 C++에서만'__func__'과 다릅니다. (이것은 당신의 문제를 해결하지 못합니다.) –

+0

2 문자열 사이 ##에 누락되었습니다. – pm100

+0

@ pm100 :'__PRETTY_FUNCTION__'은 매크로가 아닌'char []'객체의 이름으로 취급되므로'## '도움을주지 않을거야. –

답변

3

표준 C와 C는 현재 함수의 이름을 포함하는 정적 char 배열 이름 것처럼 작용하는 "매직 식별자 「__func__를 제공 ++. 실제로 값은 C++에서 구현 정의됩니다.

gcc는 __PRETTY_FUNCTION__을 제공하며 C는 __func__과 동일하며 C++에 대한 몇 가지 추가 정보를 제공합니다.

당신이 묻는 문제는 해결되지 않습니다. 문자열 리터럴 연결은 문자열 리터럴에만 적용됩니다.

귀하의 crash() 함수는 단일 문자열을 인수로 사용한다고 가정 해보십시오.

crash()을 수정하여 두 개의 인수를 사용하거나 두 개의 인수를 사용하는 새로운 래퍼 함수를 ​​작성하는 것이 좋습니다. 그런 다음 사용할 수 있습니다

#define NIMPL crash(__PRETTY_FUNCTION__, " not implemented yet") 

두 개의 문자열을 연결 (. 당신이 같은 이름으로 오버로드 할 수 ++ C를 사용하고 있기 때문에) 연습 문제로 남아 있습니다.

기존 crash() 함수에 두 번째 문자열 인수를 추가하고 기존 호출을 손상시키지 않으려면 ""의 기본값을 제공 할 수 있습니다.

2

C에서 (질문에 원래 태그가 붙어 있기 때문에) __PRETTY_FUNCTION____func__의 또 다른 이름으로, 문자열 리터럴이 아닙니다. C++에서는 함수 시그니처로 장식되었지만 여전히 문자열 리터럴은 아닙니다. documentation (특히주의 마지막 문장)에서

는 :

The identifier __func__ is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name"; 

appeared, where function-name is the name of the lexically-enclosing function. This name is the unadorned name of the function. As an extension, at file (or, in C++, namespace scope), __func__ evaluates to the empty string.
...
In C, __PRETTY_FUNCTION__ is yet another name for __func__ , except that at file (or, in C++, namespace scope), it evaluates to the string "top level" . In addition, in C++, __PRETTY_FUNCTION__ contains the signature of the function as well as its bare name.
...
These identifiers are variables, not preprocessor macros, and may not be used to initialize char arrays or be concatenated with string literals.

당신이 C++를 사용하고 있기 때문에, 당신은 좀 더 유연성을 제공하기 위해, 가변 인자 템플릿 함수가 아니라 매크로로 crash를 정의 고려할 수 있습니다.

void crash_t (std::ostringstream &oss) 
{ 
    oss << std::endl; 
    write(2, &oss.str()[0], oss.str().size()); 
    exit(1); 
} 

template <typename A, typename... REST> 
void crash_t (std::ostringstream &oss, A arg, REST... rest) 
{ 
    oss << arg; 
    crash_t(oss, rest...); 
} 

template <typename... ARGS> 
void crash (ARGS... args) 
{ 
    std::ostringstream oss; 
    crash_t(oss, args...); 
} 
+0

'__FUNCTION__'과 '__func__'이 같다고 생각합니다. 둘 다 "myFunction"을 인쇄하지만 __PRETTY_FUNCTION__을 "void myFunction()"을 출력합니다. –

+0

@ChrisSmith :'__PRETTY_FUNCTION__'이 당신에게''void myFunction() "'을 준다면, C가 아닌 C++를 컴파일하고 있습니다. 질문의 태그가 사용하고있는 언어와 일치하는지 확인하십시오. –

+0

그러면 C++로 컴파일됩니다. – jxh

관련 문제