【发布时间】:2010-11-09 15:52:42
【问题描述】:
不幸的是,这是在某些外部库中定义的:无法触摸!
// 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 的便携式替代品
基本的复制粘贴解决方法适用于 functions,但不适用于 structs。编译器将匹配重复的函数类型,但不会关联重复的结构类型:需要强制转换,重复的结构类型会在没有编译警告的情况下发散。
【问题讨论】:
-
他们会这样做正是因为他们当然不希望你声明这样的变量。例如,可能无法初始化结构,该结构保证适用于库的过去和/或未来版本,但他们已经为您提供了成员,以便您可以阅读它们或类似的东西。所以,既然你弄乱了库的约束,为什么不弄乱库头(不是库本身,只是你在代码中包含的头)?
-
对不起,我误导了你:我的真实例子实际上是函数,而不是结构。我将它简化为一个结构,因为我想不惜一切代价避免整个“函数 == 函数指针”混乱。顺便说一句,这种混乱可能是让“图书馆”作者陷入这种不幸的 typedef 的原因——请不要高估这个(实际上是内部的)“图书馆”:-)
-
@mu 和其他人:这个问题是关于 C 语言从理论、标准的角度来看的(缺乏)能力。这不是为了完成工作。直到现在我才意识到将不同的复制粘贴解决方法相互比较可能会有一些价值。
-
您可以将 GCC 方言版本改进为单行:
typeof(*(pointer_to_complex_t)0) my_variable;