因此,您在某处foo
定义了一些名为的函数,并且您想知道它的类型是什么。
foo
如果您的 d 头文件中的某个位置实际上没有原型#include
,这很容易:
- 如果您使用的是 C99,则您的代码无效。
- 否则,
foo
必须不带参数并返回int
,否则您的代码无效。
这不是那些“技术上无效,但它适用于每个平台”的案例之一;它会破裂。例如,对于 64 位 x86 linux 或 Mac,使用 gcc 4.2,如果您这样做:
double foo(double f) { return f*2; }
然后,没有头文件,这样调用它:
double f = foo(2.0);
printf("%f\n", f);
如果编译为 C89,这将很好地编译和链接(clang 或 gcc 4.8 会给你一个警告;默认情况下 gcc 4.2 甚至不会这样做),然后运行并打印出2.0
. 至少在 x86_64 上;在 ARM7 上,如果幸运的话,你会破坏堆栈和段错误。(当然,它实际上会加倍一些东西——你的 2.0 或一些随机的未初始化值——但它不能把它返回给你;它把它藏在调用者不知道要访问的任意浮点寄存器中。)
如果它在头文件中,您可以随时搜索它。emacs、图形 IDE 等在这方面非常擅长。但是您可以通过两种方式使用编译器来帮助您。
首先,只需这样做:
gcc -E main.c > main.i
less main.i
现在搜索/foo
,您会找到它。
或者你可以欺骗编译器给你一个错误信息,就像 perreal 的回答一样。