c语言静态函数调用问题

//a.cpp
static void a() //静待函数
{
cout<<"aaaaaa"<<endl;
}

//b.cpp
void b()
{
a();
}
//main.cpp
#include<iostream>
using namespace std;
#include"a.cpp"
#include"b.cpp"
void main()
{
b();
}
a()函数为静态函数,b()函数与a()函数不在同一文件,b()函数为什么可以正常调用a()函数呢???

楼上只说对一半,这里能调用a和b两个函数确实是因为使用include把a.cpp和b.cpp加入到了main.cpp里面,使用include实际是把对应代码加到include的位置。真正做项目没有这样做的,都是使用头文件的方式;
static修饰的函数和变量在别的文件是绝对不可见的,这是楼上错误的地方,即使使用extern声明函数导出,也不可以,编译时根本就不能通过,会报static类型错误,不能导出。。。
在你原来文件结构上加入头文件:
//a.h
#include <iostream>
using namespace std;
void a();
//b.h
void b();
然后把main.cpp里面的2个include分别改成a.h和b.h,编译:g++ main.cpp a.cpp b.cpp会发现报错误:
a.cpp: In function ‘void a()’:
a.cpp:3: error: ‘void a()’ was declared ‘extern’ and later ‘static’
a.h:3: error: previous declaration of ‘void a()’
这里就是因为a函数是static类型,不能导出,把static去掉这里就可以编译通过了。。。。
这也是static其中一个用法追问

你好,你的意思是,在main.cpp、a.cpp、b.cpp三个文件基础上增加两个文件(a.h和b.h)吗
//main.cpp
#include
using namespace std;
#include"a.h"
#include"b.h"
void main()
{
b();
}

//a.cpp
static void a() //静态函数
{
cout
using namespace std;
void a();

//b.h
void b();
是这样吗?但还是不行啊

追答

编译的时候用:g++ main.cpp a.cpp b.cpp
就是3个文件一起编译,这时候就会报static的错误,然后把static去掉,就可以编译通过,就知道static在这里的用处了。。
哦,在:
//b.cpp内加入一句:
#include"a.h"
意思就是在b.cpp中引入a.h使用,然后a.h声明了a函数,所以b.cpp中可以调用a函数,这里的main.cpp其实没用到a函数,可以不用这句#include"a.h"

追问

编译的时候用:g++ main.cpp a.cpp b.cpp 就是3个文件一起编译 是什么意思啊
我用的vc6.0 怎么三个文件一起编译呢,g++是什么意思呢?

追答

哦,vc啊,那就直接创建这些文件编译就行了,不需要我说的那个,我说的是linux下编译的方法,按照我说的再加一句就可以了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-01
楼主您好,是这样的,因为你的main.cpp中包含#include"a.cpp"和#include"b.cpp",他们的意思是主程序文件包含其他a和b两个文件中的内容,因此可以调用里面的函数;
如果去掉他们,若是主程序文件仍想调用他们,则必须在主程序文件中用extern声明,说明他们是在别的程序文件中,然后才可以调用。
希望对楼主理解有帮助。
第2个回答  2012-06-01
楼主去掉两个关于cpp文件的包含语句,就会发现,无法调用a函数
相似回答