Я занимаюсь программированием низкого уровня.Для цели моей задачи мне нужно инициализировать (иногда аппаратно ограниченный) массив.Это может быть просто char [], но также unsigned short или что-то в этом роде.
Наиболее читаемый способ - использовать просто некоторую строку постоянной известной длины.Чтобы облегчить задачу, я написал макрос, чтобы помочь себе.
#define INI( x ) { (x[0] << 8) | 0x00, (x[1] << 8) | 0x00 }
static const unsigned int tab[] = INI("ab");
int main(){
return 0;
}
Конечно, макрос выше находится внутри некоторого блока #ifdef и зависит от архитектуры, на которой он построен.У меня проблема в том, что я получаю ошибку:
initializer element is not constant
main.c:3: error: (near initialization for "tab[0]")
initializer element is not constant
main.c:3: error: (near initialization for "tab[1]")
Но приведенный выше код расширяется до:
static const unsigned int tab[] = { ("ab"[0] << 8) | 0x00, ("ab"[1] << 8) | 0x00 };
int main(){
return 0;
}
Каждый и КАЖДЫЙ элемент не только постоянны во время компиляции, но иво время препроцессора.Можно было бы даже создать макрос, берущий каждый символ из строки и выполняющий некоторые манипуляции (если бы только препроцессор мог получить длину строки и, конечно, имел бы некоторую возможность зацикливания).
Итак - почемуКомпилятор не может извлечь эту информацию, и каковы мои варианты?Любая помощь искренне ценится.
PS.Я знаю, что он работает внутри main () как
const unsigned int tab[] = INI("ab");
, но мне это нужно вне любой функции.