| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2428 人关注过本帖
标题:怎样用static封装一个函数
只看楼主 加入收藏
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
结帖率:73.08%
收藏
已结贴  问题点数:20 回复次数:13 
怎样用static封装一个函数
/*怎样用static封装定义一个函数,别的函数都不可以调用它(函数的作用范围)
请给出示例代码*/
这个代码虽然没有错误,可是好像不符合内部函数的归则
#include<stdio.h>//
static void fun(void);//内部函数又称为静态函数
void f(void);
static void fun(void)//定义内部函数的一般行式
{
    int a=3;
    printf("fun()函数里面的a值为:%d\n",a);
}
void f(void)
{
    fun();
    fun();
}
int main(void)
{
    fun();
    fun();
    fun();
    f();//为什么f()函数可以调用fun()函数
    return 0;
}
第二种
#include<stdio.h>
#include "file.h"
static void fun(void)
{
    int a=3;
    printf("fun()函数里面的a值为:%d\n",a);
}
int main(void)
{
    fun();
    fun();
    fun();
    f();
    return 0;
}
#include "file1.h"
void f(void)
{
    fun();
}
简单一句话怎样用关键字static封装一个函数
函数的默认扩展类型是extern,你倒是可以把函数前加static限制作用范围,即只能在本文件或者本模块里使用。

C语言里函数体内是不能定义函数的,貌似没有局部函数这一说。
“你倒是可以把函数前加static限制作用范围,即只能在本文件或者本模块里使用。”——这句话怎样理解
请各位给出点示例代码,谢谢
搜索更多相关主题的帖子: void fun include return 
2013-02-24 11:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
写在一个单独的.c或.cpp文件中自己用,其函数原型不在别的模块中声明即可。C的函数封装靠模块文件,C++直接用类。

授人以渔,不授人以鱼。
2013-02-24 11:42
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
不太理解啊,还有更简单的解释吗T版
2013-02-24 11:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你创建一个.c/.cpp文件B,写上几个函数,然后再创建另一个.c/.cpp文件A,看在A中能不能调用B中的函数——前提是不要在A中写出那些函数的原型声明。然后,把函数原型补上写在A中,再看看。做完这个测试,再告诉你是怎么回事。

这两个文件在同一个项目中。

授人以渔,不授人以鱼。
2013-02-24 11:57
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
a.c文件
#include<stdio.h>
int main(void)
{
    f();
    f1();
    return 0;
}
b.c文件
#include<stdio.h>
void f(void);
void f1(void);
void f(void)
{
    printf("hello");
}
void f1(void)
{
    printf("world");
}
int main(void)
{
    f();
    f1();
    return 0;
}
a.c文件不能调用b.c中的f()函数和f1()函数
2013-02-24 12:34
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
a.c文件
#include<stdio.h>
int main(void)
{
    f();
    f1();
    return 0;
}
b.c文件
#include<stdio.h>
void f(void);
void f1(void);
void f(void)
{
    printf("hello");
}
void f1(void)
{
    printf("world");
}
int main(void)
{
    f();
    f1();
    return 0;
}
a.c文件不能调用b.c中的f()函数和f1()函数
2013-02-24 12:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
a.c文件
程序代码:
#include<stdio.h>

/*
void f(void);
void f1(void);
*/

int main(void)
{
    f();
    f1();
    return 0;
}


b.c文件
程序代码:
#include<stdio.h>

void f(void)
{
    printf("hello");
}
void f1(void)
{
    printf("world");
}

这是一个项目中,里面有两个模块文件。这样写法,a中是无法调用b中的函数的,因为b的函数被封装在b模块中。但如果把a中注释掉的函数原型恢复,就可以调用了。

现在你回忆一下,当你没有#include头文件stdio.h的时候,编译器是不是告诉你不认识printf()函数?对了,注释掉的那一堆东西,其实就是stdio.h引入的内容,当你写自己的库函数时,把那些函数原型写在一个b.h头文件中,在需要的时候#include "b.h",某个模块包含了它,就能引用b.c中的函数,若不包含,就不能引用。这就是C分割模块和头文件的作用。

b.h
void f(void);
void f1(void);

写出这个头文件,在需要使用这些函数的模块文件.c中#include它即可,没包含这个头的模块,不认识那些函数,这就是C的简陋封装机制。记住:stdio.h之类头文件,只是这样的一些函数声明,它没有b.c那样的实现代码,不要以为把.h拷贝出去就可以用了,没有连带的实现代码文件(.c),这样做是没有用的——实现部分在.LIB或.DLL中。

[ 本帖最后由 TonyDeng 于 2013-2-24 12:49 编辑 ]

授人以渔,不授人以鱼。
2013-02-24 12:38
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
但如果把a中注释掉的函数原型恢复,就可以调用了。
#include<stdio.h>
void f(void);
void f1(void);
int main(void)
{
    f();
    f1();
    return 0;
}
这样也不行啊

2013-02-24 12:49
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:5 
这个不难吧

仰望星空...........不忘初心!
2013-02-24 12:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
同一个项目!
命令行编译指令要把两个.c文件都写上。只有a.c有main()函数,你上面写了两个main(),显然是文件分布在两个不同的项目中。

[ 本帖最后由 TonyDeng 于 2013-2-24 12:55 编辑 ]

授人以渔,不授人以鱼。
2013-02-24 12:51
快速回复:怎样用static封装一个函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042144 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved