c语言静态函数调用问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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下编译的方法,按照我说的再加一句就可以了

参考技术A 楼主您好,是这样的,因为你的main.cpp中包含#include"a.cpp"和#include"b.cpp",他们的意思是主程序文件包含其他a和b两个文件中的内容,因此可以调用里面的函数;
如果去掉他们,若是主程序文件仍想调用他们,则必须在主程序文件中用extern声明,说明他们是在别的程序文件中,然后才可以调用。
希望对楼主理解有帮助。
参考技术B 楼主去掉两个关于cpp文件的包含语句,就会发现,无法调用a函数

以上是关于c语言静态函数调用问题的主要内容,如果未能解决你的问题,请参考以下文章

C函数中如何调用未实例化类的成员函数

嵌入式 Linux C语言——静态库函数和动态库函数

c语言如何检测函数第一次的值

用C语言写的程序能调用C++写的静态库吗

c语言的auto和static类型变量

C语言中,其他文件可否调用文件中的static函数?