【发布时间】:2017-04-26 14:32:15
【问题描述】:
我在使用函数指针时遇到了一种奇怪的行为。假设我有这段代码(我将简称为 不带 typedef)
// without typedef
void* func1(void*);
void* func2(void*);
int main() {
void* (*func_pntr[])(void*) = {func1, func2};
return 0;
}
void* func1(void* arg) {
return (void*)0;
}
void* func2(void* arg) {
return (void*)0;
}
这段代码的工作方式是常见的,这里并不神秘。我们还可以编写此代码的 typedef 等效项(比如说 typedef1)
// typedef1
typedef void*(*func_t)(void*);
func_t func1(void*);
func_t func2(void*);
int main() {
func_t (*func_pntr[])(void*) = {func1, func2};
return 0;
}
func_t func1(void* arg) {
return (void*)0;
}
func_t func2(void* arg) {
return (void*)0;
}
在这种情况下,我认为理解代码没有问题。我写了第三个版本的代码(叫它typdef2)
// typedef2
typedef void*(*func_t)(void*);
void* func1(void*);
void* func2(void*);
int main() {
func_t func_pntr[] = {func1, func2};
return 0;
}
void* func1(void* arg) {
return (void*)0;
}
void* func2(void* arg) {
return (void*)0;
}
这仍然有效!我想知道可以省略函数指针数组的参数这一事实。同样,如果我用 func_t 代替 void* 编写 typedef2 来进行函数声明/定义,编译器 (GCC) 将无法编译。
有人知道这是怎么发生的吗?更准确地说,我用gcc -std=c89 -Wall test.c 编译,看看这是否与方言问题有关。
【问题讨论】:
-
你为什么使用空指针?你在这里失去了很多类型安全。当我看到很多强制转换/空指针时,我认为程序员做错了什么
-
两个顶级案例不等价。第一个
func1(例如)是一个返回void *的函数。第二个函数返回一个指向函数的指针。而且你在任何地方都没有“省略论点”。在最后一种情况下,数组函数的参数是func_t类型的一部分。 -
@EdHeal:使用 void* 不是我提出的问题的中心问题
-
我认为您发现这是使用 void 指针的设计中的错误。我将其作为评论留下
-
这是useful site C gibberish ↔ English 处理此类问题
标签: c gcc function-pointers