关于g++编译器针对动态链接库与主程序存在同名变量问题的处理方式的质疑

 在linux平台下,使用g++编译器编写一个动态链接库。 发现编译器对于库文件和主程序中的同名变量处理有不合理的地方。

//r6.h
#ifndef R6_H_
#define R6_H_

class r6 {
public:
	r6();
	void show_ood(int p,double p1);
	int p2,p3=0;
	virtual ~r6();
};

#endif /* R6_H_ */

//r6.cpp


#include "r6.h"

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

double ood;

r6::r6() {
	// TODO Auto-generated constructor stub
 p2=2;p3=3;
}

r6::~r6() {
	// TODO Auto-generated destructor stub
}
void r6::show_ood(int p,double p1)
{
	cout<<p<<endl;
	ood=8;
	cout<<"ood="<<ood<<endl;
	cout<<"the address for ood="<<&ood<<endl;
};

编译完成后,生成一个libr6.so 放置到/usr/lib 下面。

r6.h 放到/usr/include下面。

然后使用测试程序:


#include <r6.h>

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
float ood,odd2;
int main()
{
	r6 r66;

	r66.show_ood(1, 2);

	cout<<"in main ood="<<ood<<endl;
	cout<<"in main the address for ood="<<&ood<<endl;

return 0;
}

编译通过,没有报错也没有报警。

运行结果如下:

1
ood=8
the address for ood=0x55f7391c9020
in main ood=0
in main the address for ood=0x55f7391c9020

我们会发现,ood 在库文件里面被定义,为double 在程序main里面被定义为float ,不但可以并行,还能共用同一段内存。

笔者认为,为了防止混淆,在主程序编译阶段,编译器应该要么报同名错误,要么干脆将两个ood变量隔离使用。

这样将两个变量放在一个内存里,视其为同一个变量,是不科学的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值