Когда я читаю [C: Справочное руководство] Глава 3: Допрессоры. Идея возникает:
#define STR(a) #a
#define R(var, re) static char var##_[] = STR(re);\
const char * var = (var##_[ sizeof(var##_) - 2] = '\0', (var##_ + 1));
R(re, "\w\d");
printf("Hello, world[%s]\n", re);
Это портативное как в C и C++, использует только стандартные функции предварительной обработки. Хитрость заключается в том, чтобы использовать макрос для расширения \ in liternal string, а затем удалить строки с двойными кавычками.
Теперь я думаю, что это лучший способ до тех пор, пока C++ 0x не представит новый строковый синтаксис R "...". И для C я думаю, что это будет лучший путь в течение долгого времени.
Побочным эффектом является то, что мы не можем определить такую переменную в глобальной области действия C. Поскольку существует инструкция для удаления символа двойной кавычки. В C++ все в порядке.
Это синтаксис языка для символов массива символов. Альтернатива, вероятно, еще хуже: '' \ ',' w ',' + ',' \ ',' d ',' \ 0'' –
@Amardeep: «' '' '' работает даже? не будет ли это неверно истолковано как «\»? – sbi
@sbi: Вы совершенно правы. Ускорение не ограничивается только двойными кассами литералов, но также влияет на литералы символов. Я должен был знать, так как я положил \ 0 туда для терминатора. :-) –