티스토리 뷰

#define STRING_JOB(A, B) "A의 직업은 B입니다."
  • 위와같이 선언하고 STRING_JOB("홍길동", "의적") 이렇게 주면 "홍길동의 직업은 의적입니다." 라고 출력이 될것 같지만 틀렸다. "A의 직업은 B입니다." 원래 문구와 동일하게 출력이 된다.
  • 이때 원하는 출력, "홍길동의 직업은 의적입니다."을 하기 위해 사용 하는 방법이 # 연산자이다.

 

문자열 내에서 매크로의 매개변수 치환이 발생하게 만들기: # 연산자

  •  위의 문제를 해결하기 위해서는 #연산자를 사용하면 된다.
#define STRING_JOB(A, B) #A"의 직업은" #B"입니다."
#define STR(ABC) #ABC
  • 이제 다시 STRING_JOB("홍길동", "의적") 를 실행하면 우리가 원했던  "홍길동의 직업은 의적입니다." 라고 출력이 된다!
  • 그리고 c언어에서는 char* str = "홍길동" "의적"; 이렇게 "" 문자열을 나란히 연결하면 하나의 문자열로 간주한다.
  • 따라서 char* str = STR(12) STR(34) 는 char* str = "12" "34"; 로 치환되어 char* str = "1234"; 와 동일해진다.

 

필요한 형태대로 단순하게 결합하기: ## 연산자

#include <stdio.h>

// 1
#define STNUM(Y, S, P) YSP
// STNUM(10, 20, 30) // error

// 2
#define STNUM2(Y, S, P) #Y #S #P
// STNUM2(10, 20, 30) //"10" "20" "30" -> "102030"

// 3
#define STNUM3(Y, S, P) Y##S##P
// STNUM3(10, 20, 30)	//102030

int main(int argc, char *argv[])
{
	// STNUM(1, 2, 3);
	printf("%s\n", STNUM2(1, 2, 3));
	printf("%d\n", STNUM3(1, 2, 3));

	return 0;
}
  • 단순하게 나열한 문자를 합치고 싶다면 1번 방식처럼 작성하면 에러가 발생한다. 10, 20, 30은 숫자기 때문에 연산은 가능하지만 단순한 나열은 되지 않기 때문이다.
  • 2번과 3번은 출력 결과는 동일하다. 다만 코드에서도 보이다시피 STNUM2는 문자열의 출력이고 STNUM3는 숫자의 출력이다.
  • #은 문자열 내에서의 치환이나 문자열에 관련되었을 때 사용하는 연산자이다.
  • ## 연산자는 어떠한 전달인자, 숫자, 문자, 문자열 등 단순하게 연결하여 하나의 값을 얻을 때 사용한다.
  • 다만 ##으로 STNUM3("1", "2", 3)); 이렇게 문자열과 숫자를 같이 인자로 전달하면 에러가 났다. 이런 방식으로는 사용하지 못하는 것 같다.
  • 조금 단순하게 생각해서 아래 방식처럼 만드는 것도 가능하다.
#include <stdio.h>

#define MY_INT(index) int nInt_##index

int main(int argc, char *argv[])
{
	MY_INT(0) = 1; // int nInt_0 = 1;
	MY_INT(1) = 2; // int nInt_1 = 2;
	printf("%d\n", nInt_0);
	printf("%d\n", nInt_1);

	return 0;
}
  • 단순한 치환이기 때문에 변수도 생성이 가능하다.
  • 만약 ## 아니라 #을 사용하면 문자열로 취급하기 때문에 에러를 내고 불가능하다.
  • 위에서 말했듯이 #은 문자열로 치환해주는 것이고 ##은 해당 인자를 그대로, 숫자면 숫자 문자면 문자 그대로 치환을 해준다.
댓글