Если массив не имеет длительность статического хранения, то оператор может быть использован в качестве выражения инициализатора.
От C Стандартных (6.7.9 Инициализации)
4 Всех выражения в инициализаторе для объекта, который имеет статический или хранения нити длительности должна быть постоянная выражением или строкой литералов.
Примите во внимание, что вы не можете объявлять массив функций, но вы можете объявить массив указателей на функции.
Вот демонстративной программа
#include <stdio.h>
void f(void) { puts("f"); }
void g(void) { puts("g"); }
int main(void)
{
int x = 1, y = 2;
void (*fp[])(void) = { x < y ? f : g };
fp[0]();
return 0;
}
Выход программы
f
Если тип функции слишком сложный, вы можете ввести ЬурейиЙ для него. Например,
#include <stdio.h>
void f(void) { puts("f"); }
void g(void) { puts("g"); }
int main(void)
{
int x = 1, y = 2;
typedef void F(void);
F * fp[] = { x < y ? f : g };
fp[0]();
return 0;
}
Вы можете использовать условный оператор для инициализации массива со статической продолжительностью хранения. Проблема в том, что условие должно быть постоянным выражением, которое не всегда подходит. Например,
#include <stdio.h>
void f(void) { puts("f"); }
void g(void) { puts("g"); }
typedef void F(void);
F * fp[] = { 1 ? &f : &g };
int main(void)
{
fp[0]();
return 0;
}
Из стандарта C (6.6 Постоянные выражения)
9 адрес константы пустого указатель, указатель на именующий , обозначающей объект статической продолжительности хранения, или указатель на функции Обозначения; его должно быть создано с использованием оператора унарного & или целочисленного значения константы, присвоенного типу указателя, или неявно с использованием выражения типа массива или функции. массив-индекс [] и член-доступ. и ->, & и косвенные * унарные операторы и указатели-указатели могут использоваться в создании константы адреса, но значение объекта должно быть не доступно при использовании этих операторов.
Да. Это совершенно верно. До тех пор, пока 'Test()' s макрос – George
Вы * пробовали * его? Это сработало? Если нет, то какие ошибки вы получили? –
Я думаю, что единственной проблемой здесь является 'Test()', поскольку функции не являются постоянными выражениями. Если не для этого, код должен быть в порядке. – Lundin