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
'programing' 카테고리의 다른 글
Android 에뮬레이터에 텍스트 붙여넣기 (0) | 2023.06.13 |
---|---|
IIS 구성 오류 - 이 구성 섹션은 이 경로에서 사용할 수 없습니다. (0) | 2023.06.13 |
파이어베이스의 앱 토큰이 변경되는 기간과 관리 방법은 무엇입니까? (0) | 2023.06.13 |
Excel vba의 웹에 JSON 게시 (0) | 2023.06.13 |
Extender 공급자가 Extender를 반환하지 못했습니다. (0) | 2023.06.13 |