2017-10-12 1 views
3

strlen 유형은 size_t이며 long unsigned int입니다.strlen의 출력을 int에 저장할 때 경고가 표시되지 않는 이유는 무엇입니까?

왜 다음 코드를 컴파일해도 slen의 서명 여부에 대한 경고가 표시되지 않습니다?

char msg[] = "Hello"; 
int slen= strlen(msg); 

는 (나는 long unsigned int slen 같은 경고를 방지하기 위해 필요했을 것으로 예상.)

+3

아마 컴파일러 설정에 따라 다릅니다. –

+5

때문에 필요하지 않습니다. 이 변환은 완전히 합법적입니다. –

+1

GCC – DaBler

답변

6

C 및 C++ 언어 (컴파일러가 당신에게 줄 수있는 당신이 경고없이 모든 다른 종류의 정수를 복사 할 수 경고는 기본적으로 악의적 인 예외 인 char을 사용합니다. 당신이 상위 비트의 손실을 방지하기 위해이 경고를 사용할 수 있습니다 gcc

(그래서 long longint에 당신에게 32 비트 시스템에서 경고를 줄 것이다).

gcc ... -Wstrict-overflow ... 

이 자동 변환 방지하기 위해 플래그도 : (A 보풀이 컴파일 많은 문제를 일으킬 수

gcc ... -Wno-int-conversion ... 

는하지만,이 코드를 테스트하는 것이 좋습니다 수 있습니다 종류).

gcc 설명서를 보면 이러한 경고에 대한 다른 세부 정보를 얻을 수 있습니다.

-Werror 플래그를 사용하여 경고를 오류로 변환 할 수 있습니다. 그런 식으로 컴파일이 실패하는 대신 버그를 고려해야하는 작업을 계속할 수 있습니다.

+4

"기본적으로 C 및 C++에서는 경고없이 모든 다른 유형간에 정수를 복사 할 수 있습니다."- 언어가 경고를 필요로하지 않는다고 말하는 것이 더 정확합니다. 컴파일러는 원하는 것을 경고 할 수 있으며 C 표준은 컴파일러의 기본 동작이 무엇인지에 대해 아무 것도 말하지 않습니다. 구문 규칙 및 제약 조건 위반에 대한 진단을 실행하기 위해 컴파일러를 준수해야합니다. 많은 컴파일러는 기본적으로 적합하지 않습니다. –

-3

strlen은 문자열 함수로 주소를 인수로 제공해야합니다. 대괄호가없는 msg는 첫 번째 요소의 주소를 인수로 지정한다는 것을 의미합니다. strlen 함수는 널 Null 문자를 포함하지 않는 배열의 단어 수를 계산합니다. 즉 int를 반환한다는 의미에서이 예제에서 slen = 5

+0

그것은 단어가 아니라 바이트 수입니다. Win2k 이후로 많이 사용되지 않는 USC-16은 여러 단어 (문자 당 2 바이트)가됩니다. –

+0

단어가 아닌 문자 수로, 경고가없는 이유에 대한 답이 좋지 않습니다. 'strlen'은 또한'int'가 아닌'size_t'를 리턴합니다. –

+0

@RetiredNinja, no,'strlen()'은 단지 바이트를 카운트하고 첫 번째 '\ 0'에서 멈춘다. 'wchar_t' (Windows에서는 단어,'wcslen()') 또는 UTF-8 문자열 ('mbslen()'에서 문자를 셀 수있는 멀티 바이트 함수가 필요합니다. –

관련 문제