【发布时间】:2020-05-09 15:07:13
【问题描述】:
简短版:我想在调用它的同一语句中声明一个函数。我正在寻找的语法是这样的:
// foo is undeclared in this file, and implemented in another file
int main() {
void* p = (cast_to_function_that_receivs_ints_and_returns_pointer)foo(1,2);
}
长版:
以下代码创建了一个明显的implicit declaration 警告和undefined reference 错误,因为调用了foo:
// a.c
int main() {
void* p = foo(1,2);
}
我在编译中加入如下文件解决undefined reference:
// b.c
void* foo(int a, int b) {
return (void*)0xbadcafe;
}
我现在想解决implicit declaration。通常的解决方案是将 a.c 修改为 #include 声明为 foo 或声明它本身,例如:
// a.c
void* foo(int a, int b);
int main() {
void* p = foo(1,2);
}
但我宁愿不声明 foo,而是修改调用 foo 的行,类似于函数指针语法,或者我在“短版本”中发布的示例。有可能吗?
假设我精通 C 并且我有一个有效的动机 - 我想通过使用 -Dfoo=bar 重新编译来“覆盖”foo 的行为。
【问题讨论】:
-
"但我宁愿不声明 foo" --> 解释一下为什么不声明?否则声明
void* foo(int a, int b);是最好的解决方案。 -
这有什么作用?为什么这是我们应该接受的请求?它使哪些方面更清晰、更有效或更好?
-
为了解释为什么我不想声明你可以阅读问题的最后一行。
-
最后一行不解释。如果
foo被定义为bar,那么bar被调用,而不是foo,它仍然必须被声明。这个定义并没有避免声明被调用函数的要求;它只是调用了一个不同的函数,它仍然必须被声明。 -
如果你实际上有一些指向函数的指针,并且它不是它指向的函数的正确类型(例如,你就是使用通用或灵活的函数指针编写接口),然后您可以将指针转换为所需的类型并调用它。但这不是“声明”函数标识符的问题。这是一种转换。
标签: c gcc compilation static-linking