programing

printf와 vprintf 함수 패밀리의 차이점은 무엇입니까?또한 어떤 기능을 다른 기능 패밀리와 함께 사용해야 합니까?

newsource 2022. 8. 18. 23:43

printf와 vprintf 함수 패밀리의 차이점은 무엇입니까?또한 어떤 기능을 다른 기능 패밀리와 함께 사용해야 합니까?

이 두 가지 차이점들을 이해한다.printf,fprintf,sprintfetc 기능과vprintf,vfprintf,vsprintfetc 함수는 함수 인수를 처리하는 방법과 관련이 있습니다.하지만 구체적으로 어떻게요?둘 중 하나를 사용해야 할 이유가 정말 있나요?그냥 항상 써야 하나요?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