문제

나는 같은 기능이있다

void printMe (void *i)
{
    printf("%d", i);
}

공허 포인터를 전달하고 스크린에 인쇄하고 싶은 곳. I가 정수, 플로트 또는 두 배이지만 I가 숯이면 충돌하는 경우 위의 예는 괜찮습니다. C ++에서 일반적으로 사용하는 것처럼 C에는 과부하가 없습니다. 따라서 문제는 이것입니다. C에서 매개 변수 인 요소를 인쇄 할 함수를 만들 수 있습니까? 그렇다면이 순간에 나를 완전히 피하기 때문에 어떻게 가능합니까?

도움이 되었습니까?

해결책

Q1 : 따라서 질문은 이것입니다. C에서는 매개 변수 인 요소를 인쇄 할 함수를 만들 수 있습니까?

A : 원하는 방식이 아닙니다. 정보를 함수에 전달하여 전달하는 데이터 유형을 알려야합니다.

Q2 : 그리고 그렇다면 그렇다면이 순간에 나를 완전히 피할 수 있기 때문에 어떻게 가능합니까?

A : 할 수 없기 때문에 당신을 피하고 있습니다. 컴파일러 또는 런타임이 가리키는 것을 입력하는 데 사용할 수있는 공간*과 관련된 메타 데이터가 없습니다. 당신도 필요합니다

  1. a를 포함하는 구조를 통과하십시오
    포인터 및 정보에 대한 정보
    포인터는 (예 : 열거)를 가리 킵니다.
  2. 포인터가 가리키는 것에 대한 정보와 함께 추가 매개 변수를 전달합니다.

코드가 여기에 인쇄 할 수있는 유일한 것은 내가 가리키는 주소입니다.

빈 공간 포인터는 원시 데이터를 가리키며 Printf는 인쇄하는 데이터 유형을 알고 있으며 지능이 없으며 "파악"할 수 없습니다.

그렇게 간단합니다.

당신이 할 수있는 것은 기능에 유형 정보를 전달하는 것입니다. 그러나 당신은 printf it 's self와 매우 유사한 것으로 끝납니다. 여기서 다음 논쟁의 데이터에 대한 유형 정보가 포함 된 형식 문자열을 전달합니다.

도움이 되었기를 바랍니다.

또한 . . . "C ++에서 일반적으로 사용하는 것처럼 C에는 과부하가 없습니다."

C ++에서도 컴파일 타임에 과부하가 발생하고 여기에 컴파일러가 해당 기능에 어떤 데이터가 전달 될지 알 수있는 방법이 없으므로 과부하에 익숙해 져도 결코 작동하지 않을 것입니다 (예 : 동일하게 시도하지 않습니다. Printf를 사용하지만 C ++ 컴파일러로 컴파일하면 정확히 동일한 결과를 얻을 수 있습니다). 실제로 시도하십시오

cout << i;

위의 함수에서 i의 "값"이 아니라 지적한 주소를 제공합니다. 가치를 얻기 전에 I 캐스트하고 혐오해야합니다.

cout << *(int*)i;

따라서 위의 C ++에서 작동하도록하려면 과부하 된 기능 (또는 템플릿 함수, 컴파일러가 귀하를위한 함수를 롤하는 것을 제외하고는 실제로 동일한 템플릿 함수가 있어야합니다.

printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}

C에서는 해당 함수 특정 이름을 제공하면됩니다.

printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}

다른 팁

처음에는 포인터가 가리키는 것이 아니라 포인터를 인쇄하고 있습니다. 실제 내용을 인쇄하려면 통과해야합니다. *i 에게 printf, 아니다 i.

정말로이 작업을 원한다면 한 가지 해결책은 다음과 같습니다.

void printMe (void *p, int typ) {
    switch(typ) {
        case TYP_INT: printf("%d", *((int*)p)); break;
        case TYP_CHR: printf("%c", *((char*)p)); break;
        /* and so on ... */
    }
}

따라서 질문은 이것입니다. C에서는 매개 변수 인 요소를 인쇄 할 함수를 만들 수 있습니까?

그래 우리는 할 수있어. 이러한 함수는 이미 표준 라이브러리의 일부입니다. printf ;)

C에는 컴파일 타임 기능 과부하가 없으므로 런타임에 인수 유형을 제공해야합니다. 그만큼 printf 형식 문자열은이 작업을 수행하는 데 사용될 수 있으므로 이미 작동하는 솔루션이있을 때 고유 한 래퍼 기능을 구축 할 이유가 없습니다.

포인터 값을 인쇄하려는 경우 올바른 사용법은 printf("%p", i);. 'D'지정자는 정수를위한 것이고 'P'는 포인터를위한 것입니다. 이러한 올바른 것을 얻는 것은 당신의 책임이며, 당신이 그것들을 혼합하면 나쁜 일이 일어날 수 있습니다.

나는 이것이 왜 char *가 아닌 int *가 아닌지에 대해 실패할지 모르겠다. 그리고 당신은 이것을 일으키는 다른 문제가있을 수 있습니다. 여전히 %p로 실패하면 다른 것이 엉망이되었습니다. 매달려있는 포인터 또는 더블 프리 () S를 확인하기 위해 일종의 메모리 모니터 소프트웨어를 설치할 수 있는지 확인하십시오. 그 시점에서 스마트 머니는 어딘가에 메모리를 손상 시켰기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top