2015-08-08 2 views
0

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

my_array[] = { {0, ...}, {1, ...}, ... } 

У меня есть несколько #ifdef сек, устраняющие некоторые элементы из инициализации. Поэтому я хотел бы игнорировать их, если это возможно, и, следовательно, смещение было скорректировано.

+0

Возможный дубликат [Поддерживает ли счетчик времени компиляции?] (Http://stackoverflow.com/questions/6166337/does-c-support-compile-time-counters) – Jack

+0

Я изменил его на смещение. это c не C++ – user210504

+0

Я действительно ссылался на «смещение». Как это легко можно вычислить из индекса, каково использование явного добавления? – Olaf

ответ

1

Единственное «стандартное» решение (очень грязное!) Находится на __LINE__ макросов. Давайте предположим, что ваши записи представлена ​​этой структурой:

struct x { int v; }; 

1) определяют макрос, который расширяется в один элемент инициализаторе:

#define ELEM { __LINE__ - 1 } 

2) Creqate файл (т.е. "elem.c"), содержащий список элементов инициализаторах, один для каждой линии, выраженная в ELEM через в макросе:

Файл "elem.c":

ELEM, 
ELEM, 
ELEM, 
... 

3) определяет свой массив следующим образом:

struct x my_array[] = { 
#include "elem.c" 
}; 

Очевидно, что это очень неудобное решение, поэтому я рекомендую вам написать простой генератор исходного кода вместо.

Смежные вопросы