source

C 전처리기에서 스트렌을?

manysource 2023. 9. 12. 20:05

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