Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使功能仅限于主功能?_C++_Objective C_C - Fatal编程技术网

C++ 如何使功能仅限于主功能?

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

让我们说我有

文件1.c: 现在据我所知,调用sum()的test()应该会给出一个编译时错误,因为我已经将sum()声明为main的本地值,我没有得到这个值,并且程序运行良好,没有任何错误

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

我哪里做错了

  • 将函数标记为静态(这使其成为当前翻译单元的本地函数)

  • 看在上帝的份上,不要包含
    .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