C 전처리기에서 스트렌을?
구현이 가능한가요?strlen()
C 전처리기에?
주어진:
#define MYSTRING "bob"
전처리기 매크로가 있나요?X
, 그럼 이렇게 말할 수 있겠네요
#define MYSTRING_LEN X(MYSTRING)
전처리기를 사용하지 않지만 의 크기는 컴파일 시 해결됩니다.문자열이 배열에 있는 경우 이를 사용하여 컴파일 시 문자열의 길이를 결정할 수 있습니다.
static const char string[] = "bob";
#define STRLEN(s) (sizeof(s)/sizeof(s[0]))
기억해 두시오.STRLEN
위에는 null terminator가 포함됩니다. 이는 달리strlen()
.
다음을 수행할 수 있습니다.
#define MYSTRING sizeof("bob")
끝에 null이 추가되었기 때문에 제 기계에는 4라고 나와 있습니다.
물론 이것은 문자열 상수에만 적용됩니다.
MSVC 16 사용(cl.exe -Wall /TC file.c
):
#include "stdio.h"
#define LEN_CONST(x) sizeof(x)
int main(void)
{
printf("Size: %d\n", LEN_CONST("Hej mannen"));
return 0;
}
출력:
Size: 11
문자열의 크기에 NUL 문자를 더한 값입니다.
예:#define MYSTRING_LEN(s) strlen(s)
대부분의 컴파일러에서, 이것은 상수 인수에 대한 컴파일 시간 상수를 생성할 것입니다... 그리고 당신은 그것보다 더 잘 할 수 없습니다.
즉, 매크로는 필요 없고 strlen만 사용하면 됩니다. 컴파일러는 당신을 위해 작업을 수행할 수 있을 만큼 똑똑합니다.
일반적으로 C 전처리기는 실제로 어떤 데이터도 변환하지 않고, 그것을 대체할 뿐입니다.즉, C 사전 프로세서 네임스페이스를 데이터 구현(기능적) 영구 데이터 구조로 오염시킬 경우 이러한 작업을 수행할 수 있습니다.
그렇기는 하지만 문자열이 아닌 다른 것을 전달하면 전체 "추가" 기능이 현저하게 실패하기 때문에 실제로 이 작업을 수행하고 싶지는 않을 것입니다.C 사전 프로세서에는 데이터 유형의 개념이 없으며 메모리 디레퍼런스(변수에 저장된 문자열의 길이를 원하는 경우 유용함)의 개념도 없습니다.기본적으로 "어디까지 할 수 있는지 확인"하는 연습이 재미있겠지만, 결국에는 목표까지 짧은 거리만 갈 수 있는 MYSTRING_LEN을 갖게 됩니다.
또한 C 전처리기의 네임스페이스가 부족하다는 것은 그러한 매크로 확장 시스템을 억제할 수 없다는 것을 의미합니다.생성된 이름이 다른 유용한 매크로와 간섭하지 않도록 주의해야 합니다.결국에는 사전 프로세서의 메모리가 부족하게 될 것입니다. 사전 프로세서는 각 문자의 이름을 "단위" 토큰으로 변환하고 각 "단위" 토큰의 이름을 최종 십진법 표기법으로 압축하도록 실제로 구축되지 않았기 때문입니다.
언급URL : https://stackoverflow.com/questions/5022067/strlen-in-the-c-preprocessor
'source' 카테고리의 다른 글
모듈 'AppModule'에서 선언한 예기치 않은 값 '정의되지 않음' (0) | 2023.09.17 |
---|---|
웹 서비스를 위한 SOAP 또는 REST? (0) | 2023.09.12 |
'app' Android XML 네임스페이스는 무엇입니까? (0) | 2023.09.12 |
RunSettings 파일 내에서 TestRunParameters에 액세스하는 방법 (0) | 2023.09.12 |
CSS 너비의 소수점 자리가 존중됩니까? (0) | 2023.09.12 |