programing

C 전처리기 "문자열화"의 반대말

megabox 2023. 6. 13. 22:09
반응형

C 전처리기 "문자열화"의 반대말

C 프리프로세서를 사용하면 다음과 같이 매크로 인수를 문자열화할 수 있습니다.

#define TO_STRING(x) "a string with " #x

따라서 사용 시 결과는 다음과 같습니다.

TO_STRING(test)확장 대상:"a string with test"

반대로 할 수 있는 방법이 있습니까?문자열 리터럴을 입력 인수로 가져오고 C 식별자를 생성하시겠습니까?예:

TO_IDENTIFIER("some_identifier")확장 대상:some_identifier

답변 감사합니다.

편집: 필요한 용도:

3D 엔진의 장면 그래프에서 노드를 문자열 식별자로 참조하는 동시에 엄격한 루프의 문자열을 비교하는 것을 피하고 싶었습니다.그래서 컴파일의 빌드 전 단계에서 실행되고 사전 정의된 문자열을 검색하는 간단한 도구를 작성하기로 했습니다.ID("something")그런 다음 모든 토큰에 대해 괄호 사이의 문자열의 CRC32를 계산하고 해당 숫자 식별자를 포함하는 #defines로 헤더 파일을 생성합니다.예를 들어 문자열의 경우"something"다음과 같습니다.

#define __CRC32ID_something 0x09DA31FB

그런 다음 생성된 헤더 파일은 다음을 사용하여 각 cpp 파일에 포함됩니다.ID(x)매크로ID("something")당연히 로 확장될 것입니다.__CRC32ID_something그래서 사실상 컴파일러가 볼 수 있는 것은 인간에게 친숙한 문자열 대신 단순한 정수 식별자입니다.물론 지금은 간단히 만족할 것입니다.ID(something)하지만 저는 인용문을 사용하는 것이 더 말이 된다고 생각했습니다 - 어떻게 하는지 모르는 프로그래머.ID매크로웍스는 생각할 수 있습니다.something따옴표가 없는 C 식별자는 실제로 그러한 식별자가 전혀 존재하지 않는 경우입니다.

아니요, 끈을 풀면 안 돼요.

//unstringify test

enum fruits{apple,pear};

#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;

fruits enum_from_string(wstring ws)
{
 fruits f_ret;
 IF_WS_COMPARE_SET_ENUM(apple)
 IF_WS_COMPARE_SET_ENUM(pear)
 return f_ret;
}

void main()
{
 fruits f;
 f=enum_from_string(L"apple");
 f=enum_from_string(L"pear");
}

문자열에서 식별자를 만들 수 있으며, 이 작업을 C:에서 토큰 붙여넣기라고 합니다.

#define paste(n) x##n
int main(){
    int paste(n) = 5;
    printf("%d" , x5);
}


output : 5

언급URL : https://stackoverflow.com/questions/6982179/opposite-of-c-preprocessor-stringification

반응형