2014-10-13 2 views
0

Я хочу использовать магию малой злой магии для создания массива указателей на все функции в файле. К сожалению, я ограничен C99 и не очень популярным компилятором.Инициализация глобального массива указателей функций

У меня была идея, но я не уверен, если это безопасно:

void foo(void) 
{ 
    ;  
} 

void bar(void) 
{ 
    ; 
} 

typedef void (*FuncPointer)(void); 

FuncPointer array[2] = {foo, bar}; 

Я попробовал его, и он компилируется и даже работал, но в C, что на самом деле не Meen, что такого рода вещи безопасным или переносным.

Есть ли какие-либо гарантии относительно инициализации глобальных массивов указателей?

+3

Что означает «безопасный»? Означает ли это что-нибудь? Не хотите ли это определить? –

+0

Уверены, что есть гарантии: если вы их инициализируете, они инициализируются. Каковы ваши проблемы с переносимостью? И я уверен, что невозможно собрать макрос всех имен функций в файле. – mafso

+0

@KerrekSB от «safe» Я имел в виду, что «указатели будут действительны» – Amomum

ответ

1

Да, это гарантированно работает по стандарту. Все такие массивы заполняются до того, как вызывается main.

Кроме того, это гарантировано будет закончен до того, как глобальные конструкторы вызываются, если вы используете C++ или расширения компилятора конкретного, которые поддерживают глобальные конструкторы в C (например, __attribute__((constructor)) в GNU C.)

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

+0

Не изменилось бы это, если я объявлю все функции и массив статическими? – Amomum

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