2012-12-21 1 views
1

매크로에서 문자열 배열을 가져 가고 싶습니다. 첫째로 가능합니까?매크로에서 문자열 배열

예, 색인을 사용하여 색인을 사용할 때 하나씩 호출 할 수 있습니까? 이 같은

뭔가 그런 다음

#define VAR "abc", "def", "xyz" 

어디 선가 "DEF"를 사용하려면,

FUNC(VAR[1]); 
+1

매크로 사용 방법에 대한 예를 들려 줄 수 있습니까? 코드 스 니펫일까요? –

+0

나는 주된 질문을 편집했다. 나는 이런 것을 원하니? 가능한 경우, 가장 가까운 가능한 해결책은 무엇입니까? 감사합니다 – Sunny

답변

1
#define VAR(...) const char *FOO[] = { __VA_ARGS__ } 
... 
VAR("abc", "xyz"); 
printf("%s\n", FOO[0]); 

그러나주의 :

  1. 매크로 악 여기에 내가 매크로를 사용하는 제안 방법이다.
  2. 매크로에서 변수를 선언하는 것이 가장 나쁜 생각입니다.
+1

두 번째 포인트를 구독합니다. :) 적어도 변수를'char const * []'로 선언하는 것이 중요합니다. 그리고 네가하는 것처럼, 네, 이건 악한 일입니다. 결코 그렇게하지 말아야합니다. 변수의 이름을 인수로 제공하십시오. –

+0

@JensGustedt, 고마워, 나는 'const char *'로 바꿨다. 이름과 함께하는 법을 모릅니다. OP는 문자열을 매개 변수로받는 매크로를 원합니다. 오해가있을 수 있다고 생각합니다. – maverik

0

매크로는 오른쪽에있는 텍스트로 확장 그래서 귀하의 질문에 대답하려고합니다 당신 자신.

FUNC(VAR[1]); <=> FUNC("abc", "def", "xyz"[1]); 

이 오른쪽에 하나가 예상 무엇을 할 것 : 여기

매크로-S를 이해하려고 노력하는 방법입니다? 아니? 그렇다면 이것을 사용할 수 없습니다. 그러나 이것을 정적 배열 초기화에 사용할 수 있으며 예를 들어 색인을 사용하여 배열에 액세스 할 수 있습니다.

편집 :

char* a[] = {VAR}; 
FUNC(a[0]); 
+0

설명 주셔서 감사합니다. 당신은 또한 언급 한 솔루션에 대한 특급을 주시겠습니까. 감사합니다 – Sunny

+1

실제로 오른쪽에있는 것은 내가 말할 수있는 한 완벽하게 합법적 인 C++ 구문입니다 - 단지 Sunny가 원하는 것을 수행하지 않습니다. – sepp2k

+0

@ sepp2k FUNC가 취하는 인수에 따라 다르지만 아마도 단일 문자열을 기대하고 있기 때문에이 코드가 컴파일에 실패 할 것입니다. –

2

당신에게 내 코드가 도움이 될 수있다

#include<stdio.h> 
#include<stdlib.h> 
#define STRING_ARRAY "ONE", "TWO", "THREE", "NULL" 

int main(){ 

    char* STRING[] = {STRING_ARRAY}; 

    int i=0; 
    scanf("%d",&i); 
    printf("%s\n",STRING[i]); 
    return EXIT_SUCCESS; 
} 

이것은 또한 작동합니다

:~$ gcc x.c -o x 
:~$ ./x 
1 
TWO 
e:~$ ./x 
2 
THREE 

에만 재 컴파일시에 매크로를 변경해야합니다.

+0

** 삼항 연산자 **. 매크로의 남용으로는 충분하지 않습니다. – LihO

+0

@Liho : 두 번째 방법은 어떨까요? –

+0

훨씬 좋습니다. 그러나이 경우이 매크로의 유일한 목적은'char * STRING [] = {STRING_ARRAY};를'char * STRING [] = { "ONE", "TWO", "THREE" , "NULL"};'이 소스 파일이 컴파일되기 전에 매크로가 쓸모 없게됩니다. – LihO

0

C99를 시작으로 당신은 복합 리터럴

#define VAR ((char const*[]){ "abc", "def", "xyz" }) 

를 사용하고 VAR[2] 정도로 사용.

복합 문자 리터럴은 이니셜 라이저의 캐스트와 유사합니다. 여기에서 기본 유형 char const*의 배열입니다. const은 실수로 문자열 리터럴을 수정하지 않으므로 중요합니다.

모든 최신 컴파일러는 해당 배열과 문자열 리터럴의 모든 다른 어커런스를 단일 인스턴스로 접을 수 있어야합니다.

+0

루프에서 이것을 사용하고 있는데 작동하지 않습니다. VAR [i]; ? – Sunny

+0

@Sunny는 "작동하지 않습니다"? 좀 더 구체적으로 말씀해 주시겠습니까? –