C언어 define 매크로
글쓴이: kkb / 작성시간: 금, 2023/08/11 - 10:50오후
for (i=0; i<3; i++) printf("%s \n", FRUIT(i));
위와 같이 i 값에 따라서 출력하면
apple
orange
banana
출력될 수 있도록
define 매크로를 선언하려고 하는데
어떻게 해야 할 지 모르겠습니다.
어떤 식으로 해야 될까요?
#define FRUIT_0 "apple" #define FRUIT_1 "orange" #define FRUIT_2 "banana" #define FRUIT(index) FRUIT_##index for (i=0; i<3; i++) printf("%s \n", FRUIT(i));
이렇게 하면 될 줄 알았는데 어떻게 해야 할 지 모르겠습니다.
Forums:
concatenation 는 저렇게 사용할 수는 없을
concatenation 는 저렇게 사용할 수는 없을 거 같은데요. 일단
https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html 참조해 보시고..
원하시는 바를 하려면 다음과 같이 하면 되지 않을까 싶은데요.
뭐 macro 확장을 공부 하시는 거라면 도움이 안되실 듯.. ㅠ
답변 감사합니다
그것도 생각해봤었던 건데
제가 원했던 것은 아니지만 답변 감사드립니다.
항상 많은 도움 받고 있습니다.
매크로를 런타임에 있는 i 변수로 접근할 수는
매크로를 런타임에 있는 i 변수로 접근할 수는 없습니다. FRUIT(i)는 그냥 전처리기에 의해서 FRUIT_i로 바뀔 뿐입니다. c언어에서 반복 가능한 매크로는 지원하지 않기때문에 아마 쉽게 하기는 어려울 것 같습니다. 아마 c++이라면 가능할 지 모르겠습니다. 아래 링크를 참고하시면 가능한 경우의 수를 다 적어주는 식으로 구현하는 방법도 있긴 합니다.
https://stackoverflow.com/questions/28231743/self-unrolling-macro-loop-in-c-c
.
address 접근할 때 위와 같이 흔히 사용되니까요.
...
매크로가 언제 적용되나를 잘 생각해 보시면 될 것 같네요. 매크로는 실행은커녕 컴파일러의 나머지 부분이 돌기도 전에 가장 먼저 처리됩니다. 그러니까 위의 코드의 FRUIT_ADDR(i)는 이렇게 바뀌는 거죠:
매크로는 여기서 i가 변수인지 상수인지 런타임에 몇 번 바뀌는지 그런 거 전혀 모릅니다. 그냥 코드를 저렇게 바꿔 버리고, 그 코드가 컴파일이 되면 나중에 i가 바뀌면서 저 코드가 실행이 되는 거죠.
그러니까 다시 원 질문의 매크로를 들여다보면 안 된다는 걸 알 수 있습니다. FRUIT(i)는 코드에 존재하는 "i"라는 텍스트를 가지고 뭔가를 할 수 있을 뿐, 그 i의 값이 나중에 뭐가 되는지는 매크로가 알 수가 없습니다. i라는 변수가 존재해서 그 변수에 값을 대입하고 자시고 할 때에는 이미 매크로는 다 사라진 이후니까요.
답변 감사합니다
이렇게 설명하시니 확실히 이해가 되네요.
단순한 걸 헷갈려했네요.
그나마 배열로 처리하는 것이 가장 낫겠네요.
답변 주신 분들 모두 감사드립니다.
전처리기 지시자가 실행될 때 매크로 확장이 일어납니다.
전처리기 입장에서는 i가 변수 명칭(Identifier)인지 조차도 모릅니다. 그냥 i는 명칭(Preprocessing Token 中 1)으로밖에 안보입니다. 변수인지 아닌지는 Parsing(컴파일)과정 쯤 되어서야 알 수 있습니다.
댓글 달기