printf와 vprintf 함수 패밀리의 차이점은 무엇입니까?또한 어떤 기능을 다른 기능 패밀리와 함께 사용해야 합니까?
이 두 가지 차이점들을 이해한다.printf
,fprintf
,sprintf
etc 기능과vprintf
,vfprintf
,vsprintf
etc 함수는 함수 인수를 처리하는 방법과 관련이 있습니다.하지만 구체적으로 어떻게요?둘 중 하나를 사용해야 할 이유가 정말 있나요?그냥 항상 써야 하나요?printf
그것은 C에서 흔히 볼 수 있는 일이기 때문에, 또는 그것을 선택하는 정당한 이유가 있는가?vprintf
대신?
printf()
그리고 친구들은 정상적인 사용을 위한 것이다. vprintf()
그리고 친구는 당신이 직접 쓰고 싶을 때 쓰는 것이다.printf()
-like 함수.에러를 인쇄하는 함수를 쓰고 싶다고 합니다.
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
// what here?
va_end(args);
return result;
}
네가 통과할 수 없다는 것을 알게 될 것이다.args
로.printf()
,부터printf()
하나의 주장보다는 많은 주장을 받아들인다.va_list
논쟁.그vprintf()
단, 기능에는va_list
변수 개수의 인수 대신 인수를 사용합니다.따라서 완성된 버전은 다음과 같습니다.
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
fputs("Error: ", stderr);
result = vfprintf(stderr, fmt, args);
va_end(args);
return result;
}
사용하고 싶지 않다vprintf()
직접 사용하실 수 있지만, 예를 들어 랩을 싸야 할 때 매우 편리합니다.printf()
이러한 경우 변수 인수(...)를 사용하여 최상위 함수를 정의합니다.그런 다음 그것들을 모아서va_list
처리를 하고 마지막으로 콜을 합니다.vprintf()
에서va_list
인쇄가 이루어지도록 하기 위해서요.
가변 인수의 주요 어려움은 변수 수가 있는 것이 아니라 각 인수에 관련된 이름이 없다는 것입니다.va_start, va_arg 매크로는 포맷 문자열 cf에 포함된 유형 정보를 사용하여 메모리 내의 인수를 해석합니다(대부분의 C 컴파일러에서는 스택에 있습니다).Kernighan과 Ritchie, 제2판, 섹션 7.3.
이 예는 Python의 우아함을 보여줍니다.C/C++ 는, 다음의 사이의 차이를 조정할 수 없기 때문에,int error(char *fmt, ...)
그리고.int error(char *fmt, va_list ap)
따라서 모든 기능에 대해*printf
, 2개의 버전을 작성해야 합니다.즉, 1개는 도입해야 합니다....
, 다른 하나는 받아들인다.va_list
이는 기본적으로 총 기능 수를 두 배로 늘립니다.Python에서는,*list()
또는**dict()
통과하다va_list
~하듯이...
.
향후 C/C++가 이러한 인수 처리 방식을 지원할 수 있기를 바랍니다.
언급URL : https://stackoverflow.com/questions/1485805/whats-the-difference-between-the-printf-and-vprintf-function-families-and-when
'programing' 카테고리의 다른 글
C에서 함수를 매개 변수로 전달하려면 어떻게 해야 합니까? (0) | 2022.08.18 |
---|---|
프로그램 내비게이션이 있는 패스 소품 Vue.js (0) | 2022.08.18 |
어떻게 이렇게 빠르지? (0) | 2022.08.18 |
C 코드의 어레이를 0으로 합니다. (0) | 2022.08.18 |
vue.js로 값을 갱신할 때 CSS 애니메이션을 추가하려면 어떻게 해야 합니까? (0) | 2022.08.18 |