2013-07-01 4 views
2

У меня есть переменная, которую я хочу инициализировать во время выполнения до того, как остальная часть программы запустится. После инициализации я не хочу изменять значение переменной. Есть ли конструкция языка C, чтобы это делать?Предполагаемые постоянные переменные, которые необходимо инициализировать во время выполнения

Пусть моя основная программа C содержится в файле prog.c

//Contents of Prog.c 
//...includes.. and variable initialization 

int main(..) 
{ 
    //Initialize variables here 
    //.. Huge program after this where I don't want these constants to change 
} 

ответ

2

Вы можете сделать это косвенно через const указатели, по крайней мере:

typedef struct { 
    int answer; 
} state; 

const state * state_init(void) 
{ 
    static state st; 

    st.answer = 42; /* Pretend this has to be done at run-time. */ 

    return &st; 
} 

int main(void) 
{ 
    const state *st = state_init(); 
    printf("the answer is %d, and it's constant\n"," st->answer); 
} 

Таким образом, все main() имеет, a const указатель на какой-то state, который он не может изменить.

0

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

2

Постоянный глобальный должен работать, да?

const int val = 3; // Set before main starts 
        // const, so it will never change. 

int main(void) 
{ 
    printf("%d\n", val); // using val in code 
} 

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

const int const* g_pVal; 

int main(void) 
{ 
    static const int val = initialize_value(); 

    g_pVal = &val; 

    printf("%d\n", *g_pVal); 
} 
+0

Что делать, если нужно получить из переменной другие функции в других файлах? –

+1

Тогда вам нужно будет передать указатель на него. – Jite

+0

'* g_pVal' легко« extern »и доступен в любых связанных файлах. Это ** глобальный **. – abelenky