2017-11-13 13 views
3

C preprocessor 지침을 통해 snprintf 명령을 어떻게 재정의 할 수 있습니까?템플릿을 사용하여 함수 재정의

sprintf_s<sizeof(dataFile)>(dataFile, arg2, arg3); 

나는 (작동하지 않는)이 시도 :

#define sprintf_s<sizeof(x)>(args...) snprintf<sizeof(x)>(args) 

을 이미 같은 파일에서 템플릿없이 sprintf_s에 대한 호출이 필요 특히 때문에 :

#define sprintf_s(args...) snprintf(args) 
+0

'dataFile'이란 무엇이며,'sizeof (dataFile)'로 무엇을 할 것이라고 생각하십니까? –

+0

정확히 무엇을 원하는지는 명확하지 않지만 단순히 #define sprintf_s snprintf가 도움이 될 것입니다. –

답변

2

mkrs said in his/her answer으로, 전처리 기는 템플릿과 같은 함수 호출을 일치시키지 않습니다.

이 작업을위한 전처리가 필요하지 않습니다 - 사용하는 대신 가변 인자 템플릿 :

template <int Size> 
void sprintf_s(char* s, ...) 
{ 
    va_list args; 
    va_start(args, s); 
    snprintf(args); 
    va_end(args); 
} 
: snprintfva_arg를 사용

template <int Size, typename... Ts> 
auto sprintf_s(Ts&&... xs) 
{ 
    return snprintf<Size>(std::forward<Ts>(xs)...); 
} 

경우, 래퍼의 다른 종류의 필요를

더 많은 예제는 How to wrap a function with variable length arguments?을 참조하십시오.

+0

불행하게도 다음과 같은 컴파일러 오류가 발생합니다. 별개 포인터 유형 비교 (char * __ restrict, size_t, const char * __ restrict, .. .) 던져() '(일명'INT (*) (숯불 * __, 제한 부호 없음 long, const를 문자 * __ 제한, ...) 던져() ') 및 'INT * ') 내가 인정해야 나는 단지 템플릿으로 시작했지만 여전히 혼란 스러울 때가 종종 있습니다. –

+0

@EXIT_FAILURE : 아,'va_args'를 사용합니다. https://stackoverflow.com/questions/41400/how-to-wrap-a-function-with-variable-length-arguments를 참조하십시오. –

3

이것은 단순히 전 처리기에서 지원하지 않습니다. 전처리 기는 대부분 C 전 처리기와 같으며 C에는 템플리트 개념이 없습니다.

+0

OP C 전처리기를 요구하고 있습니다. (희망적으로) C 전 처리기와 거의 같습니다 ... – user463035818

+0

또한 C++로 태그도 붙어 있습니다. C++ 코드에 대한 C 전 처리기를 호출하는 것은 훨씬 의미가 없습니다. – mrks

+0

실제 코드를 다시 작성하지 않고 적절한 Linux 기능으로 리디렉션 할 수있는 방법이 있습니까? –