【发布时间】:2010-09-05 16:01:19
【问题描述】:
假设我有
文件1.c:
#include<stdio.h>
#include"File2.c"
void test(void)
{
sum(1,2);
}
int main(void)
{
int sum(int a,int b);
test();
sum(10,20);
return 0;
}
文件2.c:
int sum(int x,int y)
{
printf("\nThe Sum is %d",x+y);
}
现在就我的理解而言,调用 sum() 的 test() 应该给出一个编译时错误,因为我已经将 sum() 设为/声明为 main 本地的,但我没有得到,并且程序运行良好,无需任何错误。
我的主要目的是在 File2.c 中定义 sum 并使其成为 main() 的本地函数,这样其他函数就无法看到该函数 sum()。
我哪里出错了?
【问题讨论】:
-
在
main()内部的sum()声明前面有一个隐含的extern。使用您编写的代码,test()'看到'test()的定义,因为它出现在test()之前的翻译单元中。如果只有main()可以看到sum(),那么一个文件必须包含main()和static int sum(...){...}。 -
如果您从
test, too调用它,为什么要让sum函数仅对main可见?您是否打算拥有 2 个sum功能(用途不同)? -
@Cristian Ciupitu:Xaero 不想从
test打电话给sum;这只是一个示例,表明它没有给出编译错误。 -
在 C 中(与 C++ 不同):不需要在使用前声明函数。编译器很乐意生成适当的函数调用内容,然后链接器将链接解析后者的名称。请注意,如果在 test() 中执行 sum( 1.2 , 2.4),您将得到非常奇怪的结果,因为编译器会将双精度值推入堆栈(而不是整数),但链接器仍将正确链接代码.如果您在 main() 中执行了 sum(1.2, 2.4),那么双精度数将在被推入堆栈之前转换为整数(因为 main 函数知道 sum() 需要整数)。
标签: c++ objective-c c