К сожалению, это определено в некоторой внешней библиотеке: не может коснуться!
// library.h
typedef struct {
long foo;
char *bar;
/* ... (long & complex stuff omitted) */
} *pointer_to_complex_struct_t;
Сейчас Вопрос : как объявить переменную complex_struct_t
?
Идеальное решение, но не допускается!(невозможно изменить внешнюю библиотеку):
// library.h
/* ... (long & complex stuff omitted) */
} complex_struct_t, *pointer_to_complex_struct_t;
// my.h
extern complex_struct_t my_variable;
Непереносимое решение (gcc):
// my.h
extern typeof( * (type_placeholder)0 ) my_variable; // Thanks caf!
Другое?Лучше?Спасибо!
Бонусный вопрос: тот же вопрос для указателя функции (если есть какая-либо разница; я сомневаюсь в этом).
ДОБАВЛЕННЫЙ бонус: нижеточно такой же вопрос, но с функциями вместо структур.Это не должно иметь никакого значения для короткого ответа («Нет»), единственного ответа, который меня первоначально интересовал. Я не ожидал, что некоторые люди умрут, пытаясь узнать и выполнить мою работу с помощью творческих обходных путей, поэтому яУпростил вопрос от функций к структурам (для удобства указатели имеют специальные неявные правила преобразования для удобства и путаница).Но почему бы и нет?Давайте начнем конкурс обхода копирования и вставки.Некоторые обходные пути, вероятно, лучше других.
///// library.h //////
// Signature has been simplified
typedef double (*ptr_to_callback_t)(long, int, char *);
// Too bad this is not provided: typedef double callback_t(long, int, char *);
///// my.h /////
// This avoids copy-paste but is not portable
typedef typeof( * (ptr_to_callback_t)0 ) callback_t;
extern callback_t callback_1;
extern callback_t callback_2;
extern callback_t callback_3;
// etc.
Краткий ответ = нет, в настоящее время нет портативной альтернативы typeof
Базовый обходной путь копирования-вставки работает нормально для функции , но не для структур .Компилятор будет соответствовать дублированным типам функций , но не будет связывать дублированные типы структур : приведение требуется, и дублированные типы структур будут расходиться без предупреждения компиляции.