char 대신에 int8_t 를 사용할 수 없는건지요?
글쓴이: study / 작성시간: 화, 2021/12/21 - 3:36오후
아래 code와 같이, 자료형을 stdint.h를 사용해서 바꿔보았는데,
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> int32_t main(int32_t argc, int8_t *argv[]) { int32_t i; if (argc < 1) { printf("Error\n"); } for (i = 0 ; i < argc ; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0; }
컴파일하면 다음과 같은 warning이 나오네요
$ gcc -W -Wall main.c main.c:6:9: warning: second argument of ‘main’ should be ‘char **’ [-Wmain] int32_t main(int32_t argc, int8_t *argv[])
어떻게하면 이 warning을 없앨 수 있을까요?
Forums:
두 가지 방법이 있습니다.
두 가지 방법이 있습니다.
1.
int main(int argc, char *argv[])
쓰세요. 권장.2. 커맨드 옵션
-Wno-main
를 지정해서 해당 warning을 suppress하면 됩니다.signed
/unsigned
를 지정하지 않으면 자동으로signed
가 되는 Integer types들과 달리,char
는 독특한 정의를 가지고 있습니다.(1)
char
는signed char
혹은unsigned char
중 하나와 동등(equivalent)한데, 둘 중 어느 것과 동등한지는 implementation-defined 입니다.=> 즉, 구현에 따라
char
에 부호가 있을 수도, 없을 수도 있습니다.(2)
char
는signed char
및unsigned char
중 어느 것과도 compatible하지 않습니다.반면에
int8_t
와uint8_t
는 명확하게 부호 있는/없는 32비트 정수형으로typedef
되기 때문에 (보통은 각각signed char
및unsigned char
입니다). 둘 중 어느 것도char
와 compatible하지 않습니다.=> 어느 쪽을 사용하더라도
char
를 대신할 수는 없다는 뜻입니다.======
물론 이건 타입에 대한 논의일 뿐이고 런타임에서 이게 문제가 될 만한 상황을 찾기는 쉽지 않겠습니다.
warning 꺼버리고 그냥 진행하면 어지간해선 문제 없을지도 몰라요.
하지만
-Wall
줘놓고 저런 식으로 코딩을 하면서 아무 경고도 안 뜨길 바라는 건 과욕이죠.======
애초에 왜
int main(int argc, char *argv[])
놔두고 그렇게 코딩을 하세요?꼭 그렇게 일부러 이식성 없는 프로그래밍을 해야 되겠습니까?
typo 정정
명확하게 부호 있는/없는 32비트 정수형 => 명확하게 부호 있는/없는 8비트 정수형
댓글 달기