Новая строка и одинарные двойные кавычки в #define - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь создать программу (просто для удовольствия), которая требует что-то вроде этого:

#define TEST "HELLO
#define TEST2 WORLD\n"

...

printf(TEST TEST2);

...

, и я хочу, чтобы результат был

HELLO WORLD

однако этот код не работает.

Можно ли как-нибудь включить символы новой строки и двойные кавычки, подобные этой, в C?

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019

Упорядочение макросов с использованием \" до escape цитата дает вам

#include <stdio.h>

#define TEST "\"HELLO "
#define TEST2 "WORLD\"\n"

int main(void) {
    printf(TEST TEST2);
}

и выводит "HELLO WORLD"

3 голосов
/ 23 сентября 2019

Вы не можете этого сделать;последовательность замены макроса состоит из полных токенов.Макросы работают на уровне токенов, а не на уровне персонажей.Ваш пример содержит неопределенные строковые литеральные токены.

Существует оператор ##, который можно использовать в последовательностях замены макросов для объединения токенов, но входные данные для ## не могут быть фрагментами токена.

Однако в синтаксисе C смежные строковые литеральные токены объединяются в единый строковый литеральный объект.Например, "A" "B" означает то же самое, что и "AB".

Таким образом, если мы позволим себе начать с токенов HELLO и WORLD в качестве входных данных, то мы создадим "HELLO WORLD\n", используямакрос, например:

#include <stdio.h>

#define XMAC(A, B) #A " " #B "\n"
#define MAC(A, B) XMAC(A, B)

#define TEST HELLO
#define TEST2 WORLD

int main(void)
{    
  printf("%s", MAC(TEST, TEST2));
  return 0;
}

Когда дело доходит до препроцессора C, вам действительно нужно следить за своей главной целью (такой как достижение общего улучшения в организации программы) и быть готовым к корректировкедетали требований о том, как этого достичь, а не настаивать на каком-то очень специфическом подходе.

...