C++ 如何使功能仅限于主功能?
让我们说我有 文件1.c: 现在据我所知,调用sum()的test()应该会给出一个编译时错误,因为我已经将sum()声明为main的本地值,我没有得到这个值,并且程序运行良好,没有任何错误 我的主要目的是在File2.c中定义sum,并使其成为main()的本地函数,这样就没有其他函数可以看到这个函数sum() 我哪里做错了C++ 如何使功能仅限于主功能?,c++,objective-c,c,C++,Objective C,C,让我们说我有 文件1.c: 现在据我所知,调用sum()的test()应该会给出一个编译时错误,因为我已经将sum()声明为main的本地值,我没有得到这个值,并且程序运行良好,没有任何错误 我的主要目的是在File2.c中定义sum,并使其成为main()的本地函数,这样就没有其他函数可以看到这个函数sum() 我哪里做错了 将函数标记为静态(这使其成为当前翻译单元的本地函数) 看在上帝的份上,不要包含.c文件!() 您已经在File1.c中包含了File2.c,因此在File1.c中定义了s
.c
文件!()您已经在File1.c中包含了File2.c,因此在File1.c中定义了sum函数。删除这一行,事情就会正常进行(您必须在File2.c中包含)
请注意,大多数编译器将接受test()中使用的sum()函数的隐式定义,除非它们处于严格模式。例如,调用
gcc File1.c File2.c
将成功,不会出现错误。如果要查看所有可用的警告,请调用gcc-Wall-pedantic File1.c File2.c
,这将警告您sum是在test()中隐式定义的,并且sum()的实现不返回int。即使这样,它也将成功编译并运行。原型在编译时很有用,因为它们告诉编译器函数的签名是什么。不过,它们不是访问控制的手段
您要做的是将sum()
放入与main()
相同的源文件中,并给它static
链接。声明它为static
意味着它将仅在该.c
文件中可用,因此其他源文件中的函数将无法调用它
然后将test()
移动到另一个源文件。这将允许main()
调用test()
,但不允许test()
调用sum()
,因为它现在位于不同的源文件中
文件1.c
顺便说一下,请注意,我注释掉了行#include“File2.c”
。切勿将#include
用于.c
源文件,仅用于.h
头文件。相反,您将分别编译这两个源文件,然后将它们链接在一起以生成最终程序
如何做到这一点取决于您的编译器。如果在Windows上使用IDE类Visual C++,则将两个源文件添加到项目中,并将它们链接在一起。在Linux上,您可以使用以下内容编译它们:
$ gcc -o test File1.c File2.c
$ ./test
在
sum()
的声明前面有一个隐式extern
,在main()
内部。在编写代码时,test()
会看到test()
的定义,因为它在test()
之前出现在翻译单元中。如果只有main()?您是否计划使用2个sum
函数(有不同的用途)?@Cristian Ciupitu:Xaero不想从test
调用sum
;这只是一个例子,表明它没有给出编译错误。在C中(与C++不同):不要求在使用前声明函数。编译器将乐于生成适当的函数调用,然后链接器将链接解析后面的名称。请注意,如果在test()中执行sum(1.2,2.4),则会得到非常奇怪的结果,因为编译器会将double(而不是整数)推到堆栈上,而链接器仍然会正确链接代码。如果在main()中执行sum(1.2,2.4),那么double将在被推送到堆栈之前转换为int(因为main函数知道sum()需要整数)。原型前面不应该有static吗?静态整数和(整数a,整数b)<代码>静态
仅在功能实现时才有意义。原型永远不会在外部可见(即对其他.c文件可见),它们只告诉编译器“当您准备好链接一个可执行文件时,一个名为sum的函数看起来是可用的。”Xaero是正确的;无知就是无知。如果稍后将定义函数static
,则在原型中省略static
是无效的(编译器应发出诊断消息)。为了学究式,如果后续原型与包含该函数的早期原型匹配,则在后续原型中省略static
是有效的。然而,对我来说,这似乎是可怕的、毫无意义的脆弱。因此,广义上,R是正确的。看到这个问题(尽管表面上要求C,C++回答…):只需标记函数<代码>静态< /代码>将不起作用,除非XAIR也改变了包含“代码>和”的定义<代码> >代码>测试< /代码>。
int sum(int x,int y)
{
printf("\nThe Sum is %d",x+y);
}
#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);
}
$ gcc -o test File1.c File2.c
$ ./test