如何将功能仅限于主要功能?

Sad*_*que 3 c c++ objective-c

让我们说我有

FILE1.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;
}
Run Code Online (Sandbox Code Playgroud)

file2.c中:

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().

我哪里错了?

fre*_*low 7

  1. 将函数标记为static(这使其成为当前转换单元的本地).

  2. 为了上帝的爱,也没有包括.c文件!(读我)


Joh*_*ica 5

原型在编译时很有用,因为它们告诉编译器函数的签名是什么。但它们不是访问控制的手段。

您想要做的是将其放入sum()相同的源文件中并main()为其提供static链接。声明它static意味着它只能在该一个文件中使用.c,因此其他源文件中的函数将无法调用它。

然后移动test()到另一个源文件。这将让main()调用test()但不让test()调用sum(),因为它现在位于不同的源文件中。

文件1.c

#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)

文件2.c

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)