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

时间:2010-09-05 16:01:19

标签: c++ objective-c 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;
}

file2.c中:

int sum(int x,int y)
{
printf("\nThe Sum is %d",x+y);
}

现在,根据我的理解,test()调用sum()应该给出一个编译时错误,因为我已经/声明了sum()本地到main,我没有得到,程序运行良好没有任何错误。

我的主要目的是在File2.c中定义sum并使其成为main()的本地,这样其他函数就无法看到这个函数sum()。

我哪里错了?

3 个答案:

答案 0 :(得分:7)

  1. 将该函数标记为static(这使其成为当前翻译单元的本地函数)。

  2. 为了爱上帝,包含.c个文件! (read me

答案 1 :(得分:4)

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

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

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

FILE1.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);
}

file2.c中

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。即使这样,它也会成功编译并运行。