매크로에서 붙여넣은 토큰을 대문자로 바꿀 수 있습니까?
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-token
s 매크로 확장을 사용하여 연결, 제거(제거) 등.
즉, 대문자는 개별 문자로 시작하여 대문자로 시작한 다음 모든 항목을 접착하는 것이 유일한 희망임을 의미합니다.대소문자 개별 문자는 유한 집합만 사용할 수 있기 때문에 매우 간단합니다.반면에, 그것들을 접착하는 것은 적어도 당신이 고정된 최대 길이로 제한한다면 가능할 것입니다.다음과 같은 매크로가 사용될 수 있습니다.
TEST(t,e,s,t,1)
언급URL : https://stackoverflow.com/questions/3400386/can-you-capitalize-a-pasted-token-in-a-macro
'sourcecode' 카테고리의 다른 글
JavaScript를 사용하여 세션을 만드는 방법은 무엇입니까? (0) | 2023.08.07 |
---|---|
Moodle 3.6의 질문 뱅크에서 임의 질문을 추가하는 동안 코딩 오류가 발생했습니다. (0) | 2023.08.07 |
Get-ChildItem 결과 수 제한 (0) | 2023.08.07 |
오류 500.19 'oracle.manageddataaccess.client' 구성 섹션에 섹션 선언이 없으므로 읽을 수 없습니다. (0) | 2023.08.07 |
ORA-00604 ORA-12705 (0) | 2023.08.07 |