Конкатенация массива во время компиляции - PullRequest
4 голосов
/ 01 сентября 2011

C поддерживает конкатенацию константных строк во время компиляции. Могу ли я сделать то же самое для любого константного массива? (Например, объединить два набора символов **.)

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

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

#define ARRAY_ONE "test1", "test2", "test3"
#define ARRAY_TWO "testa", "testb", "testc"

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

#define ARR(...) {__VA_ARGS__}

Теперь вы можете использовать один массив или любую необходимую вам комбинацию, например:

char *arr1[] = ARR(ARRAY_ONE);
char *arr2[] = ARR(ARRAY_TWO);
char *arrc1[] = ARR(ARRAY_ONE, ARRAY_TWO);
char *arrc2[] = ARR(ARRAY_ONE, ARRAY_TWO, ARRAY_ONE, ARRAY_ONE);

Использование макросов для достижения таких результатов - плохая практика.

2 голосов
/ 01 сентября 2011

Краткий ответ: Нет.

Более короткий короткий ответ: строковые литералы действительно являются символьными массивами, но не все символьные массивы являются строковыми литералами. Конкатенация во время компиляции работает только для строковых литералов. Никакие массивы не имеют такой "особенности".

0 голосов
/ 01 сентября 2011

No

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