sourcecode

매크로에서 붙여넣은 토큰을 대문자로 바꿀 수 있습니까?

copyscript 2023. 8. 7. 22:53
반응형

매크로에서 붙여넣은 토큰을 대문자로 바꿀 수 있습니까?

C 매크로에서, 붙여넣기 토큰을 자본화하는 것이 가능합니까?예를 들어 현재 다음과 같은 매크로가 있습니다.

#define TEST(name, keyword) \
    test_##name:
        TEST_##keyword##_KEYWORD

저는 이것을 다음과 같이 적용할 것입니다.

TEST(test1, TEST1)

그러면 다음과 같은 결과를 얻을 수 있습니다.

test_test1:
    TEST_TEST1_KEYWORD

이제 동일한 이름을 두 번 입력하는 대신(한 번은 모든 소문자로, 다시는 모든 대문자로) 다음 중 하나를 수행하고 토큰을 모두 대문자 또는 소문자로 변경할 수 있는 방법이 있습니까?

TEST(test1) or TEST(TEST1)

고마워, 라이언

제가 알기로는 C 프리프로세서(최소한 ISO/ANSI 표준)의 토큰에서 수행할 수 있는 작업은 토큰을 교체하거나 '스트링화'하거나 연결하는 것뿐입니다.또한 GCC 또는 MSVC 확장 기능을 사용하여 원하는 작업을 수행할 수 있는지도 모릅니다.

하지만, 사람들은 매크로로 마술적인 (혹은 끔찍한) 일을 할 수 있는 영리한 (혹은 이상한) 방법을 생각해 냈기 때문에, 누군가가 나를 놀라게 해도 나는 놀라지 않을 것입니다.

다음과 같은 작업을 수행할 수 있습니다(테스트되지 않은, 아마도 오타일 것입니다...).

#define NORMALIZE(TOK) NORMALIZE_ ## TOK

그리고 발생할 수 있는 각 글에 대해 수행합니다.

#define NORMALIZE_test1 test1
#define NORMALIZE_TEST1 test1

그런 다음 사용합니다.NORMALIZE당신의 실제 매크로 안에 있는 매크로 같은 것.

#define TEST(name, keyword)                    \
    test_ ## NORMALIZE(name):                  \
        TEST_ ## NORMALIZE(keyword) ##_KEYWORD

(그러나 모든 연결이 제대로 될 때까지 중간 도우미 매크로를 수행해야 할 수도 있습니다.)

전처리기가 다음의 입력 스트림에서 작동하기 때문에 가능하지 않습니다.pp-token그리고 이것들을 의미 있는 방식으로 분해할 수 있는 구조가 없습니다.

전처리기에 있는 것은 대체할 구조입니다.pp-tokens 매크로 확장을 사용하여 연결, 제거(제거) 등.

즉, 대문자는 개별 문자로 시작하여 대문자로 시작한 다음 모든 항목을 접착하는 것이 유일한 희망임을 의미합니다.대소문자 개별 문자는 유한 집합만 사용할 수 있기 때문에 매우 간단합니다.반면에, 그것들을 접착하는 것은 적어도 당신이 고정된 최대 길이로 제한한다면 가능할 것입니다.다음과 같은 매크로가 사용될 수 있습니다.

TEST(t,e,s,t,1)

언급URL : https://stackoverflow.com/questions/3400386/can-you-capitalize-a-pasted-token-in-a-macro

반응형