programing

전처리기를 이용한 문자열 연결

easyjava 2023. 10. 1. 23:07
반응형

전처리기를 이용한 문자열 연결

전처리 중에 문자열을 연결하는 것이 가능합니까?

이 예시를 찾았습니다.

#define H "Hello "
#define W "World!"
#define HW H W

printf(HW); // Prints "Hello World!"

그러나 사용할 때는 "Hello"를 출력합니다.gcc -std=c99

업데이트 이 예제는 지금 작동하는 것 같습니다.하지만 c 전처리기의 정상적인 기능인가요?

인접한 문자열 리터럴의 연결은 전처리기의 특징이 아니라 핵심 언어(C와 C++)의 특징입니다.다음과 같이 쓸 수 있습니다.

printf("Hello "
       " world\n");

전처리기에서 토큰을 연결할 수는 있지만 까다롭기 때문에 주의해야 합니다.핵심은 ## 연산자입니다.코드의 맨 위에 이걸 던지려면:

#define myexample(x,y,z) int example_##x##_##y##_##z## = x##y##z 

그러면 기본적으로 이 작업은 사전 처리 중에 해당 매크로에 다음과 같은 호출을 수행합니다.

myexample(1,2,3);

그리고 말 그대로 그것이

int example_1_2_3 = 123;

이를 통해 올바르게 사용할 경우 코딩하는 동안 유연성이 크게 향상될 수 있지만 사용 방법이 정확히 적용되지는 않습니다.마사지를 조금만 해주면 효과를 볼 수 있습니다.

예를 들어 다음과 같은 솔루션을 사용할 수 있습니다.

#define H "Hello "
#define W "World!"
#define concat_and_print(a, b) cout << a << b << endl

그런 다음에 뭔가를 합니다.

concat_and_print(H,W);

gcc 온라인 문서에서:

'##' 전처리 연산자는 토큰 붙여넣기를 수행합니다.매크로가 확장되면 각 '##' 연산자의 양쪽에 있는 두 개의 토큰이 단일 토큰으로 결합되고, 이 토큰은 매크로 확장에서 '##'과 두 개의 원래 토큰을 대체합니다.

명명된 명령어를 해석하는 C 프로그램을 생각해 봅니다.명령어 테이블이 필요할 수도 있고, 다음과 같이 선언된 구조의 배열이 필요할 수도 있습니다.

 struct command
 {
   char *name;
   void (*function) (void);
 };

 struct command commands[] =
 {
   { "quit", quit_command },
   { "help", help_command },
   ...
 };

각 명령어 이름을 문자열 상수에 한 번, 함수 이름에 한 번씩 두 번 지정하지 않아도 되는 것이 더 깔끔할 것입니다.명령어의 이름을 인수로 사용하는 매크로는 이를 불필요하게 만들 수 있습니다.문자열 상수는 문자열화를 사용하여 생성할 수 있으며, 함수 이름은 인수를 다음과 연결하여 생성할 수 있습니다._command. 수행 방법은 다음과 같습니다.

 #define COMMAND(NAME)  { #NAME, NAME ## _command }

 struct command commands[] =
 {
   COMMAND (quit),
   COMMAND (help),
   ...
 };

이것이 작동하는 이유에 대해 출처를 인용하는 답변을 추가하려고 생각했습니다.

C99 표준 §5.1.1.2는 C 코드에 대한 번역 단계를 정의합니다.제6관은 다음과 같이 규정합니다.

  1. 인접 문자열 리터럴 토큰이 연결됩니다.

마찬가지로, C++ 표준(ISO 14882)에서 §2.1은 번역의 단계를 정의합니다.여기서 서브섹션 6은 다음과 같습니다.

6 인접한 일반 문자열 리터럴 토큰이 연결됩니다.인접한 넓은 문자열 리터럴 토큰이 연결됩니다.

이것이 문자열을 서로 인접하게 배치하는 것만으로 문자열을 연결할 수 있는 이유입니다.

printf("string"" one\n");

>> ./a.out
>> string one

입니다.#defineH에 줄을 대다"Hello ").

언급URL : https://stackoverflow.com/questions/5106280/string-concatenation-using-preprocessor

반응형