Следующий код компилируется отлично, если я удаляю статический классификатор, но я не понимаю, почему он не работает в противном случае. Я вижу строку в разделе .rodata (при компиляции без статического классификатора), а конечная сборка просто загружает указатели надлежащим образом перед вызовом printf.Инициализатор не постоянный ... Я знаю, но я чувствую, что это должно работать, почему это не так.
#include <stdio.h>
#define S "Testing"
#define C 't'
typedef struct {
char const * const s;
char const c;
} foo;
int main(int argc, char **argv)
{
static foo const f = {
.s = S,
.c = S[3],
};
printf("s = %s, c = %c\n", f.s, f.c);
return 0;
}
Кроме того, он отлично компилируется со статическим классификатором, если я использую:
.c = C,
Интересно, что сборка выглядит идентично (да, НКУ угоняет «т» из «Тестирование»)
Этот фрагмент просто демонстрирует конкретный пример, с которым я сталкиваюсь в гораздо более сложной проблеме. Почему компилятор не может рассматривать строковый литерал [] как константу, когда это ясно?
BTW, скомпилирован с GCC 5.4 только с -O2
Edit: Для того, чтобы уточнить, проблема заключается в инициализации f.c
Edit: Спасибо за Insights всех. Таким образом, препроцессор не может ничего делать со строками, что является хромым. Если я действительно реализую то, что я пытаюсь сделать в области действия функции, компилятор (с оптимизацией) в конечном итоге переработает все до констант в разделе .rodata, но я не могу сделать то же самое в глобальной области, к сожалению ,
Решение: Написать пользовательский питон скрипт (или любой другой ваш любимый язык сценариев) для генерации кода, или использовать C++
Для уточнить, проблема заключается в инициализации fc –
Редактирование вашего разъяснения в вопросе, а не комментарий. – Barmar