让我们说我有
#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;
}
int sum(int x,int y)
{
printf("\nThe Sum is %d",x+y);
}
现在,根据我的理解,test()调用sum()应该给出一个编译时错误,因为我已经/声明了sum()本地到main,我没有得到,程序运行良好没有任何错误。
我的主要目的是在File2.c中定义sum并使其成为main()的本地,这样其他函数就无法看到这个函数sum()。
我哪里错了?
答案 0 :(得分:7)
将该函数标记为static
(这使其成为当前翻译单元的本地函数)。
为了爱上帝,不包含.c
个文件! (read me)
答案 1 :(得分:4)
原型在编译时很有用,因为它们告诉编译器函数的签名是什么。但它们不是访问控制的手段。
您要做的是将sum()
放入与main()
相同的源文件中,并将其static
链接。声明它static
意味着它只能在那个.c
文件中使用,因此其他源文件中的函数将无法调用它。
然后将test()
移动到另一个源文件。这会让main()
拨打test()
但不要让test()
拨打sum()
,因为它现在位于不同的源文件中。
#include <stdio.h>
/* NO! Do not #include source files. Only header files! */
/*** #include "File2.c" ***/
/* Prototypes to declare these functions. */
static int sum(int a, int b);
void test(void);
int main(void)
{
test();
sum(10, 20);
return 0;
}
/* "static" means this function is visible only in File1.c. No other .c file can
* call sum(). */
static int sum(int x, int y)
{
printf("\nThe Sum is %d", x + y);
}
void test(void)
{
/* Error: sum() is not available here. */
sum(1, 2);
}
顺便提一下,请注意我注释了#include "File2.c"
行。您永远不应将#include
用于.c
源文件,仅用于.h
头文件。相反,您将分别编译两个源文件,然后将它们链接在一起以制作最终程序。
如何做到这一点取决于您的编译器。如果您在Windows上使用像Visual C ++这样的IDE,那么将两个源文件添加到项目中,它将负责将它们链接在一起。在Linux上,您可以使用以下内容编译它们:
$ gcc -o test File1.c File2.c
$ ./test
答案 2 :(得分:1)
您已在File1.c中包含File2.c,因此sum函数在File1.c中定义。删除该行,事情应该有效(你必须在File2.c中#include <stdio.h>
。)
请注意,除非它们处于严格模式,否则大多数编译器都会接受test()中使用的sum()函数的隐式定义。例如,调用gcc File1.c File2.c
将成功,没有错误。如果要查看所有可用的警告,请调用gcc -Wall -pedantic File1.c File2.c
,它将警告您在test()中隐式定义了sum,并且sum()的实现不返回int。即使这样,它也会成功编译并运行。