티스토리 뷰
#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;
}
- 단순한 치환이기 때문에 변수도 생성이 가능하다.
- 만약 ## 아니라 #을 사용하면 문자열로 취급하기 때문에 에러를 내고 불가능하다.
- 위에서 말했듯이 #은 문자열로 치환해주는 것이고 ##은 해당 인자를 그대로, 숫자면 숫자 문자면 문자 그대로 치환을 해준다.
'C\\C++' 카테고리의 다른 글
[C/C++] 10, 2, 16, 8 진수 변환 규칙 (0) | 2023.01.07 |
---|---|
[C/C++] 가변인자 함수 (1) | 2023.01.04 |
[C/C++] 조건부 컴파일(#if #ifdef #ifndef #endif···) (0) | 2023.01.01 |
[C/C++] 선행처리기(전처리)와 매크로 (0) | 2022.12.26 |
[C/C++] static 과 extern (0) | 2022.12.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- #define
- c 가변인자
- JavaScript
- ajax 403에러
- 영속성전파
- c++ 가변인자
- c 매크로
- Double.compareTo(Double)
- JPA #cascade
- Builder #SuperBuilder
- linux select
- 표준입출력 함수
- JPQL 사용하기
- static의 장점 단점
- 나만의 강점
- java
- Java8 #java stream
- C++
- MySql 날짜 차이 구하기
- 매크로
- 이중 콜론 연산자
- C언어
- javascript 문자열 뒤집기
- 메소드 참조 연산자
- ##연산자
- Java Double형 비교방법
- Til
- JPA #SPRING #ENTITY #DATABASE
- 전처리기
- 네트워크 오더링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함