2016-06-16 3 views
2

cpp에 오류를 추가하여 내 소스 코드에 누가 그 문자열 크기를 변경하는지 알려주려고합니다. 너무 작아서 데이터를 처리 할 수 ​​없습니다. . 어떻게하면 전처리 기와의 비교를위한 문자열의 크기를 얻을 수 있습니까?

내가
#if STRING_LENGTH < MAX_STRING_LENGTH 
#error "you need to extend the value of MAX_STRING_LENGTH" 
#endif 

같은 것을 가지고 코드의 연속적인 부분에서 원하는
#define STRING "Hello world" 

같은가 someting가 있다고 가정 그래서하는 질문 : 어떻게 STRING_LENGTH를 정의 할 수 있습니다?

+5

답변이 나왔기 때문에 질문을 닫아야합니다. [here] (http://stackoverflow.com/q/5022067/strlen-in-the-c-preprocessor). 전처리 기는 아니지만 컴파일시에 여전히 해결 된 sizeof()를 사용하십시오. –

+0

알다시피, sizeof는 cpp 조건문에서 사용할 수 없습니다. –

+0

@Ottavio_Campana 당신이 [오른쪽] (http://stackoverflow.com/questions/4079243/how-can-i-use-sizeof-in-a-preprocessor-macro) –

답변

3

전처리 기에서 수행 할 수 없습니다. 당신이 할 수있는 최선의 방법은 컴파일 시간을 일정하게하는 것이다. a의 길이를 얻을 수있는 C 프리 프로세서가 어떤 메커니즘을 제공하지 않습니다

_Static_assert(sizeof(STRING) - 1 < MAX_STRING_LENGTH, "you need to extend the value of MAX_STRING_LENGTH") 
0

: 그런 다음 컴파일 시간 체크를 할 C11에서 _Static_assert를 사용할 수있는 동일한 strlen("string literal")

sizeof("string literal") - 1이 될 것입니다 문자열 리터럴.

static void validateSTRING(void) { 
    (void)(char[MAX_STRING_LENGTH]){STRING}; 
} 

(참고 : MAX_STRING_LENGTH의 사용이 고의적이었다

그러나, GCC/C99이나 C11 모드에서 그 소리와 -Wall 옵션을 사용하여, 당신은 같은 것을 삽입하여 컴파일러 경고를 강제 할 수 있습니다. 배열을 실제로 할당했다면, NUL 터미네이터의 공간을 허용하기 위해 MAX_STRING_LENGTH+1을 원할 것입니다. 그러나 여기서는 경고를 생성하려고하는데, 의도적으로 NUL을위한 공간을 남기지 않는다면 컴파일러는 경고하지 않습니다.

+0

이 방법은 문제가 있기 때문에 C는 이상한 문자열 리터럴의 초기화에만 적용되는 특별한 경우 규칙 : 6.7.9/14 "문자 유형의 배열은 문자열 리터럴 또는 UTF-8 문자열 리터럴로 초기화 할 수 있으며 선택적으로 중괄호로 묶습니다. 문자열 리터럴의 연속 바이트 (배열이 알 수없는 크기 인 경우 종료 문자를 포함하여) 배열의 요소를 초기화하십시오. " 이것은 당신이 컴파일러를 전혀 진단하지 못할 수도 있다는 것을 의미합니다. 그래서이 대답은 좋은 추천이 아닙니다. 여기서 C는 C++과 다릅니다. – Lundin

+0

예를 들어, gcc가 널 종결자가 적합하지 않은'char str [5] = "hello"; '에 대한 진단을 제공 할 수 없습니다. – Lundin

+0

@ lundin : 나는 내 추천이 최대 문자열 길이가 없다고 말하는 것을 게을리했다. 대부분 그들은 malloc에 ​​대한 불합리한 공포의 대상입니다. 그래서 나는 그것이 권고가 아니라는 것에 동의한다. 그러나 gcc는 경고를 생성합니다. 당신이 말했듯이, 그것은 오류가 아니며 다른 컴파일러들이 얻지 못할 수도 있지만, 그 대답은 그것이 작동 할 특별한 경우를 지정합니다. – rici