32 대 64 플랫폼 크기의 printf: 플랫폼 독립적인 방식으로 포맷 코드를 처리하려면 어떻게 해야 합니까?
프로그램에서 사용한 메모리 양을 출력하는 코드가 있습니다.선이 이와 비슷합니다.
printf("The about of RAM used is %u", anIntVariable*sizeof(double) );
여기서 IntVariable은 이중 배열의 요소 수에 대한 int 변수입니다.어쨌든 32비트 시스템에서는 아무런 문제가 없었지만 64비트 시스템에서는 부호 없는 긴 정수에 "%u"를 사용하는 것에 대해 컴파일러 경고를 받습니다.%lu를 포맷 코드로 사용하면 64비트에서 문제가 해결되지만, 타입이 부호 없는 int로 되돌아가기 때문에 컴파일러가 32비트에서 불평하게 됩니다.실제로 32비트 시스템과 64비트 시스템에서 크기가 (두 배로) 다른 값을 반환한다는 것을 발견했습니다.코드를 32비트에서 64비트로 변환할 수 있는 웹 페이지 가이드를 찾았지만 앞뒤로 변환하는 대신 둘 다에서 작동하는 코드를 원합니다.
이 행을 플랫폼 독립적인 방식으로 작성하려면 어떻게 해야 합니까?저는 전처리기 지시어를 사용해서 할 수 있는 많은 방법들을 알고 있지만 그것은 해킹처럼 보입니다.분명 제가 깨닫지 못하는 우아한 방법이 있을 겁니다.
휴대용 인쇄물 식별자는 포함 파일 또는 여기에 제공됩니다.
여기에는 특정 런타임에 사용할 휴대용 식별자가 많이 포함되어 있습니다.예를 들어, "PRIuPTR"을 원하는 경우, "최대 포인터 크기의 PRINTF Identifier unsigned"를 의미합니다.
예를 들면 다음과 같습니다.
printf("The amount of RAM used is %" PRIuPTR, anIntVariable*sizeof(double) );
GCC 4.3이 탑재된 64비트 Linux에서의 결과(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을 접두사로 하는 스캔도 식별자가 있습니다.
의 크기의 반환값은 size_t입니다.C99 호환 컴파일러를 사용한다면 사용할 수 있을 것 같습니다.
%zd
%zu
이 일로
도우:%zu
물론입니다고마워, 오니.
먼저 "%" 지정자를 인쇄할 실제 데이터 유형과 일치시켜야 합니다. 의 크기는 데이터 유형 size_t를 반환하며, "%d" 지정자를 사용하여 플로트를 인쇄하려고 하면 안 되는 것처럼 "%u" 또는 "%d"가 포함된 size_t 또는 size_t를 실제로 의미하지 않는 것을 인쇄하려고 하면 안 됩니다.
다른 응답은 새로운 컴파일러("%z" 및 PRIu32)로 이 문제를 해결할 수 있는 몇 가지 좋은 방법을 제공했지만, 기존에는 단순히 size_t를 비부호 길이로 캐스팅한 다음 "%lu"를 사용하여 인쇄하는 방식이었습니다.
printf("The amount of RAM used is %lu", (unsigned long)(anIntVariable*sizeof(double)) );
이것은 size_t가 long보다 넓은 시스템에서는 작동하지 않지만, 저는 그러한 시스템에 대해 알지 못하며, 표준이 그것을 허용하는지도 확신할 수 없습니다.
언급URL : https://stackoverflow.com/questions/1403074/printf-with-sizeof-on-32-vs-64-platforms-how-do-i-handle-format-code-in-platfor
'programing' 카테고리의 다른 글
Angular 2 라우터.항법 (0) | 2023.10.14 |
---|---|
뜻뜻뜻 (0) | 2023.10.14 |
InnerBlocks 속성을 가져와 상위 블록에 저장 (0) | 2023.10.14 |
JavaScript - 정의되지 않은 속성을 설정할 수 없습니다. (0) | 2023.10.14 |
Golang, mysql: 오류 1040:연결이 너무 많음 (0) | 2023.10.09 |