让我们说我有
#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;
}
Run Code Online (Sandbox Code Playgroud)
int sum(int x,int y)
{
printf("\nThe Sum is %d",x+y);
}
Run Code Online (Sandbox Code Playgroud)
现在我的理解是test()调用sum()应该给出一个编译时错误,因为我已经/声明了sum()本地到main,我没有得到,并且程序运行良好没有任何错误.
我的主要目的是在File2.c中定义sum并使其为main()的本地,这样其他函数就无法看到这个函数sum().
我哪里错了?
原型在编译时很有用,因为它们告诉编译器函数的签名是什么。但它们不是访问控制的手段。
您想要做的是将其放入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);
}
Run Code Online (Sandbox Code Playgroud)
void test(void)
{
/* Error: sum() is not available here. */
sum(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,请注意,我注释掉了该行#include "File2.c"。您永远不应该将#include其用于.c源文件,而只能用于.h头文件。相反,您将分别编译两个源文件,然后将它们链接在一起以生成最终程序。
如何做到这一点取决于您的编译器。如果您在 Windows 上使用 Visual C++ 等 IDE,则将两个源文件添加到项目中,它将负责将它们链接在一起。在 Linux 上,你可以使用如下命令来编译它们:
$ gcc -o test File1.c File2.c
$ ./test
Run Code Online (Sandbox Code Playgroud)