2012-01-22 3 views
3

전 처리기를 사용하여 #define을 사용하여 특정 키워드를 다른 단어로 바꿀 수 있습니다. 예를 들어 #define name "George"을 할 수 있고 전처리 기가 프로그램에서 '이름'을 찾을 때마다이를 "George"로 바꿉니다.C++ 전 처리기를 문자열에 사용하는 방법은 무엇입니까?

그러나 이것은 코드에서만 작동하는 것 같습니다. 문자열과 텍스트로 어떻게이 작업을 수행 할 수 있습니까? 예를 들어, "안녕하세요 저는 이름입니다"라고 화면에 인쇄 할 경우 문자열이 아니라 코드로되어 있어도 '이름'이 '조지'로 바뀌길 원합니다.

수동으로 키워드 문자열을 검색 한 다음 바꾸지 않고 대신 전 처리기를 사용하여 단어를 전환하고 싶습니다.

이것이 가능합니까? 그렇다면 어떻게?

저는 C++을 사용하고 있지만 C 솔루션도 사용할 수 있습니다.

답변

15
#define name "George" 

printf("Hello I am " name "\n"); 

인접 문자열 리터럴은 C 및 C++로 연결됩니다. C 및 C++ 표준에서

지수 : C를 들어

는 (C99을 인용하지만, C11은 6.4.5p5에서 비슷한 있습니다) :

(C99, 6.4.5p5) "번역을 단계 6에서 인접 문자 및 동일하게 접두사가 붙은 문자열 리터럴 토큰의 임의의 시퀀스로 지정되는 멀티 바이트 문자 시퀀스가 ​​단일 멀티 바이트 문자 시퀀스로 연결됩니다. " ++ C 용

:

(C++ 11 2.14.5p13) "는 번역 단계 6 (2.2), 인접 스트링 리터럴 연접한다."

EDIT : 요청에 따라 C 및 C++ Standard에서 따옴표를 추가하십시오. @MatteoItalia 덕분에 C++ 11의 견적을받을 수있었습니다.

+0

이것은 컴파일되지 않습니다. –

+0

이것은'printf ("Hello"나 "George" "\ n");가되며, 이것은 유효하지 않습니다. –

+13

이것은 C에서 완벽하게 유효하며 구현시이를 컴파일해야합니다. – ouah

3

문제는 전 처리기가 문자열 리터럴 안에 인 토큰을 대체하지 않는다는 것입니다.

그래서 당신은 전처리보다는 printf 같은 함수 또는 변수를 사용하거나과 같이 문자열에서 토큰을 끌어 다음 중 하나 여야합니다

#include <iostream> 

#define name "George" 

int main(int argc, char** argv) { 
    std::cout << "Hello I am " << name << std::endl; 
} 
다음
7
#define name "George" 

printf("Hello I am %s\n", name); 

조지 "로 대체됩니다 이름 "

관련 문제