C99의 일부로 채택 된 새로운 (비트 너비 특이 적) 형식 옵션 문자열이없는 이유는 무엇입니까?

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

문제

크로스 플랫폼을 수행하는 방법을 연구하는 동안 printf() C의 형식 문자열 (즉, 각 정수 인수가 예상되는 비트 수를 고려하여 printf() 나는) 나는 가로 질러 달렸다 Wikipedia 기사 의이 섹션 printf(). 이 기사는 전달할 수있는 비표준 옵션에 대해 설명합니다. printf() (Microsoft 특정 확장자 인 것 같음)와 같은 형식 문자열 : :

printf("%I32d\n", my32bitInt);

계속해서 다음과 같이 말합니다.

ISO C99에는 플랫폼 독립적 인 Printf 코딩에 사용할 수있는 다수의 매크로가 포함 된 inttypes.h 헤더 파일이 포함되어 있습니다.

... 그런 다음 해당 헤더에서 찾을 수있는 매크로 세트를 나열합니다. 헤더 파일을 보면 사용하려면 다음을 작성해야합니다.

 printf("%"PRId32"\n", my32bitInt);

내 질문은 : 내가 뭔가를 놓치고 있습니까? 이것이 실제로 표준 C99 방법입니까? 그렇다면 왜? (너무 번거로운 것처럼 보이므로 형식 문자열을 이런 식으로 사용하는 코드를 본 적이 없다는 사실에 놀라지 않습니다 ...)

도움이 되었습니까?

해결책

C 이론적 근거는 그것을 암시하는 것 같습니다u003Cinttypes.h> 기존 연습을 표준화하고 있습니다.

u003Cinttypes.h> 기존의 여러 64 비트 시스템에서 발견 된 동일한 이름의 헤더에서 파생되었습니다.

그러나 텍스트의 나머지 부분은 그 매크로에 대해 글을 쓰지 않으며 당시에는 기존 연습이라는 것을 기억하지 못합니다.

다음은 추측이지만 표준화위원회의 작동 방식에 대한 경험에 의해 교육을받습니다.

Printf의 추가 형식 지정자 표준화에 대한 C99 매크로의 한 가지 장점 (C99도 추가 했음)이 제공하는 것입니다. <inttypes.h> 그리고 <stdint.h> 구현 특정 방식으로 필요한 기능을 지원하는 구현이 이미있는 경우 적절한 typedef 및 매크로로 두 개의 파일을 작성하는 것입니다. 이는 기존 구현 비용을 줄이고 기존 구현 세부 사항 기능 (표준 방식은 방해하지 않음)을 사용하는 기존 프로그램을 위반하는 위험을 줄이고 이들을 가지고 있지 않은 구현으로의 구현에 대한 포팅을 용이하게합니다. 헤더 (프로그램에서 제공 할 수 있음). 또한 구현 특정 방식이 당시에 이미 다양하다면 한 구현을 선호하지 않습니다.

다른 팁

맞습니다. 이것이 C99 표준이 사용해야한다고 말하는 방식입니다. 편지에 100% 표준이있는 진정한 포르 블트 코드를 원한다면 항상 인쇄해야합니다. int 사용 "%d" 그리고 int32_t 사용 "%"PRId32.

그러나 대부분의 사람들은 그렇게하지 않는 경우가 거의 없기 때문에 귀찮게하지 않을 것입니다. 코드를 Win16 또는 DOS로 포팅하지 않는 한 sizeof(int32_t) <= sizeof(int), 실수로 인쇄하는 것은 무해합니다 int32_t 로서 int. 마찬가지로, a long long 거의 보편적으로 64 비트입니다 (그렇게 보장되지는 않지만) 인쇄 int64_t A로 long long (예 : a %llx Specifier)도 안전합니다.

유형 int_fast32_t, int_least32_t, 등은 거의 사용되지 않으므로 해당 형식 지정자가 훨씬 더 드물게 사용된다고 상상할 수 있습니다.

항상 위로 캐스트하고 사용할 수 있습니다 %jd 그것이 intmax_t 형식 지정자.

printf("%jd\n", (intmax_t)(-2));

나는 사용했다 intmax_t 어떤 것도 보여주기 위해 intXX_t 사용할 수는 있지만 단순히 캐스팅 long 더 좋습니다 int32_t 그런 다음 사용합니다 %ld.

나는 이유에 대해서만 추측 할 수 있습니다. 위의 Aprogrammer의 답변이 마음에 들지만 한 가지 측면이 간과되었습니다. 형식 수정 자로 printf에 무엇을 추가 할 것입니까? 이미 숫자가 printf 형식 문자열 (너비 및 정밀)으로 사용되는 두 가지 방법이 있습니다. 세 번째 종류의 숫자를 추가하여 논쟁에 몇 개의 정밀도가 얼마나 큰지 말하지만, 혼란스럽지 않고 어디에 두겠습니까? 불행히도 C의 결함 중 하나는 printf가 확장 가능하도록 설계되지 않았다는 것입니다.

매크로는 끔찍하지만 32 비트 및 64 비트 플랫폼에서 휴대 할 수있는 코드를 작성해야 할 때는 신의 선물입니다. 확실히 내 베이컨을 구했습니다.

나는 당신의 질문에 대한 답을 생각합니다 다음 중 하나입니다

  • 아무도 더 좋은 방법을 생각할 수 없거나
  • 표준위원회는 그들이 느낀 것이 분명하다고 생각하는 것에 동의 할 수 없었습니다.

또 다른 가능성 : 후진 호환성. 더 많은 형식 지정자를 추가하는 경우 printf, 또는 추가 옵션은 일부 C99 코드의 지정자가 형식 문자열을 다르게 해석 할 수 있습니다.

C99 변경으로는 기능을 변경하지 않습니다. printf.

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