32 대 64 플랫폼에서 크기가있는 printf : 플랫폼 독립적 인 방식으로 형식 코드를 어떻게 처리합니까?

StackOverflow https://stackoverflow.com/questions/1403074

  •  05-07-2019
  •  | 
  •  

문제

프로그램에서 사용하는 메모리 양을 인쇄하는 코드가 있습니다. 라인은 이것과 유사합니다.

printf("The about of RAM used is %u", anIntVariable*sizeof(double) );

여기서 anintvariable은 이중 배열의 요소 수에 대한 int 변수입니다. 어쨌든, 32 비트 시스템에서는 아무런 문제가 없었지만 64 비트 시스템에서는 서명되지 않은 긴 정수에 "%U"를 사용하는 것에 대한 컴파일러 경고를받습니다. 형식 코드로 "%lu"를 사용하면 64 비트에서 문제가 해결되지만 유형이 서명되지 않은 int로 돌아 가기 때문에 컴파일러가 32 비트에서 불만을 제기합니다. 실제로 (이중) 크기가 32 대 64 비트 시스템에서 다른 값을 반환한다는 것을 알았습니다. 웹 페이지 가이드를 찾았습니다 전환하다 코드는 32 비트에서 64 비트이지만 앞뒤로 변환하는 대신 두 가지 모두에서 작동하는 코드가 있습니다.

이 라인을 플랫폼 독립적 인 방식으로 어떻게 작성합니까? 나는 전처리 서기 지시문을 사용하여 할 수있는 여러 가지 방법을 알고 있지만 해킹처럼 보입니다. 분명히 내가 깨닫지 못하는 우아한 방법이 있습니다.

도움이 되었습니까?

해결책

휴대용 printf 식별자는 포함 파일에 제공됩니다 inttypes.h.

여기에는 특정 런타임에 대한 많은 휴대용 식별자가 포함되어 있습니다. 예를 들어, 당신은 priuptr을 원합니다.PRintf 치과기 최대 포인터 크기의 크기로 nsigned ".

그러면 예제는 다음과 같습니다.

printf("The amount of RAM used is %" PRIuPTR, anIntVariable*sizeof(double) );

GCC 4.3을 사용한 64 비트 리눅스의 결과 (int anIntVariable = 1):

$ gcc test.c -m32 -o test && ./test
The amount of RAM used is 8
$ gcc test.c -o test && ./test
The amount of RAM used is 8

완전성을 위해서는 SCN 인 SCNF에 대한 식별자도 있습니다.

다른 팁

크기의 반환 값은 size_t입니다. C99 호환 컴파일러를 사용하는 경우 사용할 수있는 것처럼 보입니다. %zd%zu 이것을 위해.

D 'OH : %zu (서명되지 않은) 물론. 고마워요, ony.

우선, "%"지정자와 인쇄하려는 실제 데이터 유형과 일치해야합니다. 크기 데이터 유형을 반환합니다 size_t, "%d"지정자를 사용하여 플로트를 인쇄하지 않아야하는 것처럼 "%u"또는 "%d"로 size_t를 인쇄하거나 크기 _t를 의미하지 않는 것을 시도해서는 안됩니다.

다른 답변은 새로운 컴파일러 ( "%z"및 priu32)로 이것을 처리 할 수있는 몇 가지 좋은 방법을 제공했지만, 우리가 사용했던 방식은 단순히 서명되지 않은 길이로 캐스팅 한 다음 "%lu"를 사용하여 인쇄하는 것이 었습니다. :

printf("The amount of RAM used is %lu", (unsigned long)(anIntVariable*sizeof(double)) );

이것은 size_t가 길고 넓은 시스템에서는 작동하지 않지만 그러한 시스템에 대해서는 알지 못하며 표준이 허용하는지조차 확실하지 않습니다.

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