2017-12-13 2 views
4

바이트 배열을 사용하는 소규모 네트워킹 응용 프로그램을 만들고 있습니다. 전통적으로 이것들은 char buf[] = ...과 같은 것으로 선언 될 것입니다.C : uint8_t로 바이트 배열 선언시 문제가 있습니까?

이것은 대부분의 자습서에서 (아직?) 완료된 것처럼 보이지만 실제로 배열이 인쇄되도록 시도 할 때 모든 문자가 아니라는 것을 잊어 버리는 등의 문제가 있습니다. 보이는 문자입니다.

일부 사용자 have suggestedchars을 더 이상 사용하지 말고 대신 uint8_t을 사용하십시오. 나는 그것이 매우 매력적이라는 사실을 발견했다. 대부분은 암묵적인 것보다 암묵적인 것이 더 낫다는 원칙에있다.

따라서 이러한 종류의 배열을 uint8_t buf[] = ...으로 선언하는 데 문제가 있습니까?

+1

나에게 그것은 아무것도 잘못된 것 같습니다. char는 모든 플랫폼에 대해 8 비트 (1 바이트)로 'uint8_t'와 같이 정의됩니다. un 또는 signed의 유일한 차이점은 캐스팅하거나 int로 변환 할 때 부호 확장입니다. –

+1

@PaulOgilvie - ('char'은 8 비트 임) 보장 할 수 없습니다. 압도적으로 공통적 인 예, 그렇지만 보장되지는 않습니다. –

+0

char가 8 비트 (thanks @OliverCharlesworth) 인 경우 char가 필요한 경우 char을 사용해야하고 바이트가 requried 인 경우에는 uint8_t를 사용해야합니다. 예를 들어 네트워크 인터페이스에서, 예를 들어 문자 처리시). –

답변

3

C99에 stdint.h 헤더가 도입 된 이후부터 작은 숫자를 나타 내기 위해 char 유형을 계속 사용해야하는 좋은 이유가 없습니다.

의도를 더 잘 문서화하는 것 외에도 uint8_t은 한 가지 더 중요한 이점을 제공합니다. 즉, 바이트가 부호없는 것으로 취급 될 것임을 보증합니다. char을 사용할 때 서명 또는 서명되지 않은 것으로 간주 할 수 없습니다.이 동작은 구현에 따라 정의 되었기 때문입니다.

는 지금까지 버퍼의 실수로 인쇄가 많은 플랫폼에이 unsigned char 위해 단순히 typedef 때문에 uint8_t는 어떤 보호를 보장하지 않을 사용갑니다.

+1

'uint8_t'는 문자 유형에 대한 typedef가 아닐 수도 있으므로 다른 유형의 별명을 지정하는 데 사용할 수 없다는 이론적 인 문제가 있습니다 ... 미래의 어느 시점에서 수정 될 것으로 예상됩니다. –