Как разрезать строку на несколько частей с помощью макроса C? - PullRequest
1 голос
/ 09 января 2011

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

make_array ("string1,{string2,{string3,{...,{stringN");

Таким образом, макрос заменит эту функцию на многомерный массив и обрежет эту строку, где бы он ни встречался ,{. Код выше будет выглядеть примерно так:

make_array = { "string1", "string2", "string3", ..., "stringN"};

Я использую GCC; как я могу это сделать?

Обновление: я думал, что мог бы исключить кавычки строки, используя макрос, поэтому у меня была бы строка без текста, и я мог бы редактировать строку в макросе, но GCC не принимает объявление макроса для замены двойных кавычек (как показано ниже).

#define macro_array ( "text") text

Таким образом, текст будет отображаться без двойных кавычек, и я мог бы найти отметку ,{, обрезать ее и использовать затем stringify, чтобы повернуть строку назад.

Ответы [ 5 ]

7 голосов
/ 09 января 2011

Вы можете получить умеренное приближение к тому, что вам нужно, с помощью C99 и переменных аргументов в макросах:

Источник

#define make_array(name, dim1, dim2, ...) \
            static char name[dim1][dim2] = { __VA_ARGS__ }

make_array(mine, 2, 2, "abc", "def", "ghi", "jkl");

Вывод

$: gcc -E xx.c
# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"

static char mine[2][2] = { "abc", "def", "ghi", "jkl" };
$

Однако,вы не можете легко разделить строку в препроцессоре в соответствии с запросом - это просто неправильный инструмент для задания.

4 голосов
/ 09 января 2011

Вы не можете выполнять обработку строк с помощью макросов.

Я не уверен, что точно понимаю, что вы хотите сделать, но, вероятно, это лучше всего достигается с помощью функции.

3 голосов
/ 09 января 2011

Забудь об этом.Я вижу слишком много вопросов в духе "Как я могу сделать мой код таким?"когда вопрос для достижения хорошего кода должен звучать так: «Как я могу заставить мой код работать так?»Какую цель вы пытаетесь достичь?

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

1 голос
/ 09 января 2011
  1. Избавьтесь от кавычек и используйте макрос с переменным числом
  2. Напишите функцию для разделения строки и вызовите ее из макроса
  3. Не используйте для этого макросы, простосделать статическую встроенную функцию.Это так же быстро.
0 голосов
/ 09 января 2011

Как уже сказал Оли, этот тип обработки строк невозможен с макросами.Конкатенация и замена других строк - это примерно столько же, сколько вы можете сделать с макросами.

Я думаю, что ответом здесь является вопрос - почему входная строка должна быть такого формата?Написание требуемого результата не требует больше усилий, чем написание вашего ввода, так почему вы хотите испытать боль от его обработки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...