通过动态链接库实现调用者不需要重新编译的情况下被调用者的更改可生效
被调用者头文件str.h
#ifndef STR_H
#define STR_H
#include <iostream>
#include <string.h>
using namespace std;
class myclass{
public:
enum{
a,
b,
c
};//A
// enum{
// a,
// b,
// d,
// e,
// c
// };//B
// static string fun(string s1,string s2)
// {
// cout<<c<<endl;
// return s1;
// };
static string fun(string,string);
};
#endif
被调用者函数strfun.c
#include "str.h"
string myclass::fun(string s1,string s2)
{
cout<<c<<endl;
return s1;
}
调用者函数main.c
#include <stdio.h>
#include "str.h"
int main(int strc,char* strs[])
{
string s1,s2,s3;
s1 = "Hello ";
s2 = "World!";
s3 = myclass::fun(s1,s2);
cout<<s3<<endl;
cout<<myclass::c<<endl;
return 0;
}
g++ -Wall -I./ -c strfun.c
g++ -shared -o libstrf.so strfun.o
用来生成动态链接库libstrf.so
g++ -Wall -I./ -L./ -lstrf -o main main.c
./main
生成main,运行结果如下:
2
Hello
2
str.h文件中放开B,注释A
仅编译链接库
g++ -Wall -I./ -c strfun.c
g++ -shared -o libstrf.so strfun.o
./main
运行结果:
4
Hello
2
同样的实验方式,改为fun在头文件中实现,myclass::fun(s1,s2)结果不会更改,以上。
总结:要想实现“调用者不需要重新编译的情况下被调用者的更改可生效”,需要将声明与实现分离。