Пытаюсь использовать макрос в C для раскрашивания текста, но получаю: error: Ожидается ')' - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь написать макрос на основе терминальной строки в C для моих будущих проектов.Пока что все, что у меня есть, это:

#define ANSI_RED     "\x1b[31m"
#define ANSI_GREEN   "\x1b[32m"
#define ANSI_YELLOW  "\x1b[33m"
#define ANSI_BLUE    "\x1b[34m"
#define ANSI_MAGENTA "\x1b[35m"
#define ANSI_CYAN    "\x1b[36m"
#define ANSI_RESET   "\x1b[0m"

#define ANSI_COLOR(color, string) color string ANSI_RESET

#define FOREGROUND 38
#define BACKGROUND 48

#define RGB_COLOR(plane, r, g, b, string) "\033[" plane ";" r ";" g ";" b "m" string ANSI_RESET

Макрос ANSI_COLOR работает просто отлично, но когда я пытаюсь использовать RGB_COLOR вот так:

printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );

Я получаю сообщение об ошибке:

/c-http-server/main.c:17:23: error: expected ')'
    printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );
                      ^
/c-http-server/libs/c-chalk/chalk.h:11:20: note: expanded from macro 'FOREGROUND'
#define FOREGROUND 38
                   ^
/c-http-server/main.c:17:11: note: to match this '('
    printf( RGB_COLOR(FOREGROUND, 248, 42, 148, "Starting the server:\n") );

Я искал эту проблему в SO, и большинство решений было связано с поиском дополнительного символа ')', но я не могу найти его в своем коде.

Я был бы рад, если бы кто-нибудь мог помочь мне найти проблему, может быть, я просто слеп и пропустил что-то очевидное.

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Похоже, вы пытаетесь объединить строки и целые числа, что невозможно.

Как быстрое решение, вы можете попробовать

#define FOREGROUND "38"
#define BACKGROUND "48"

и используйте его как

printf( RGB_COLOR(FOREGROUND, "248", "42", "148", "Starting the server:\n") );

С другой стороны, должно быть возможно (и чище) преобразовать в строку параметры (не проверено):

#define xstr(a) str(a)
#define str(a) #a
#define RGB_COLOR(plane, r, g, b, string) "\033[" str(plane) ";" str(r) ";" str(g) ";" str(b) "m" string ANSI_RESET

Обратите внимание на объезд через xstr и str, потому что строковое преобразование предотвращает расширение макроса, как правильно заметил @John Bollinger.

0 голосов
/ 06 марта 2019

Когда вы объединяете строки, вы можете сделать это как "aa" "bb", а результат будет похож на запись "aabb".

Итак, когда вы вызываете printf (arguments), разрешается писать

printf("str1" "str 2")

но если вы хотите вызвать printf, комбинируя строковые аргументы с числами, вы должны поставить запятую между аргументами

printf("aa" "bb", 100)

В противном случае интерпретатор будет считать, что вы пришли к последнему аргументу - в случаях, подобных

printf("aa" "bb" 100)

он посчитает, что вы должны закрыть круглые скобки до 100.

В вашем случае вы пытаетесь позвонить

printf (RGB_COLOR (38, 248, 42, 148, «Запуск сервера: \ n»));

переписано в

printf(  "\033[" "Starting the server:\n"  ";" 248 ...... )

Это значит

printf(  "\033[Starting the server:\n;"  248 ...... )
                                       ^->HERE EXPECTS COMMA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...