c语言编译时出现initialized,解决编译warning:warning: ‘MeteringUnit::voltage_gain_’ will be initialized after [-W...

本文解决了一个关于构造函数成员变量初始化顺序导致的编译警告问题。通过调整MeteringUnit类构造函数中成员变量的初始化顺序,成功消除了编译警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

环境:ubuntu 12.04,g++版本4.6.3,编译目标文件时出现warnings:

u1204@u1204-zhw:~/hwsvn/2sw/4prj_mips/UCP_rt5350/src/trunk$ make clean;make

rm -f *.o local_ctrl

g++ -g3 -Wall -o0 -c msgrcv_cmd.cpp -o msgrcv_cmd.o

In file included from msgrcv_cmd.h:24:0,

from msgrcv_cmd.cpp:30:

controller.h: In constructor ‘MeteringUnit::MeteringUnit(size_t, double, double, double)’:

controller.h:92:12: warning: ‘MeteringUnit::voltage_gain_’ will be initialized after [-Wreorder]

controller.h:91:12: warning: ‘double MeteringUnit::current_gain_’ [-Wreorder]

controller.h:77:5: warning: when initialized here [-Wreorder]

g++ -g3 -Wall -o0 -c controller.cpp -o controller.o

In file included from controller.cpp:21:0:

controller.h: In constructor ‘MeteringUnit::MeteringUnit(size_t, double, double, double)’:

controller.h:92:12: warning: ‘MeteringUnit::voltage_gain_’ will be initialized after [-Wreorder]

controller.h:91:12: warning: ‘double MeteringUnit::current_gain_’ [-Wreorder]

controller.h:77:5: warning: when initialized here [-Wreorder]

g++ -g3 -Wall -o0 -c thread.cpp -o thread.o

g++ -g3 -Wall -o0 -c ini_file.cpp -o ini_file.o

g++ -g3 -Wall -o0 -c main_ctrl.cpp -o main_ctrl.o

In file included from main_ctrl.cpp:25:0:

controller.h: In constructor ‘MeteringUnit::MeteringUnit(size_t, double, double, double)’:

controller.h:92:12: warning: ‘MeteringUnit::voltage_gain_’ will be initialized after [-Wreorder]

controller.h:91:12: warning: ‘double MeteringUnit::current_gain_’ [-Wreorder]

controller.h:77:5: warning: when initialized here [-Wreorder]

解决办法:

1. 出问题的地方在头文件controller.h中,

class MeteringUnit {

public:

MeteringUnit(size_t port_num = 1, double pgain = 1.0, double cgain = 1.0, double vgain = 1.0)

: port_(port_num), power_gain_(pgain), voltage_gain_(vgain), current_gain_(cgain) { }

~MeteringUnit();

void Refresh();

double Power() const;

double Current() const;

double Voltage() const;

private:

size_t port_;

operation* mu_op_;

static const SensorType sensor_typ_ = EMETER;

private:

static const int emeter_pulse_const_ = 3200;

double power_gain_;

double current_gain_;

double voltage_gain_;

double power_;

double current_;

double voltage_;

int gpqs1_;// GP1/GQ1/GS1(0x50/0x51/0x52)

int gphs1_;// Gphs1(0x6d)

int p1offset_;// P1offset(0x65)

};

从编译后的提示,已经可以很明白地看出错在什么地方了,

MeteringUnit::voltage_gain_应该在double MeteringUnit::current_gain_之后初始化。

也就是说,构造函数中变量初始化的顺序与该成员变量在类MeteringUnit中定义的顺序不一致。

将其中的两行

MeteringUnit(size_t port_num = 1, double pgain = 1.0, double cgain = 1.0, double vgain = 1.0)

: port_(port_num), power_gain_(pgain), voltage_gain_(vgain), current_gain_(cgain) { }

改为

MeteringUnit(size_t port_num = 1, double pgain = 1.0, double cgain = 1.0, double vgain = 1.0)

: port_(port_num), power_gain_(pgain), current_gain_(cgain), voltage_gain_(vgain) { }

重新编译,问题解决。

u1204@u1204-zhw:~/hwsvn/2sw/4prj_mips/UCP_rt5350/src/trunk$ make clean;make

rm -f *.o local_ctrl

g++ -g3 -Wall -o0 -c msgrcv_cmd.cpp -o msgrcv_cmd.o

g++ -g3 -Wall -o0 -c controller.cpp -o controller.o

g++ -g3 -Wall -o0 -c thread.cpp -o thread.o

g++ -g3 -Wall -o0 -c ini_file.cpp -o ini_file.o

g++ -g3 -Wall -o0 -c main_ctrl.cpp -o main_ctrl.o

g++ -o local_ctrl msgrcv_cmd.o controller.o thread.o ini_file.o main_ctrl.o -L../../drivers -lphysicalop -lpthread

解决警告“ld: warning: directory not found for option

因为已经把文件编译到项目中,删除的话会出现找不到文件或文件夹的警告. 1选择工程, 编译的 (targets) 2选择 Build Settings 菜单 3查找 Library Search Pat ...

iOS - 解决警告“ld: Warning: Directory Not Found for Option”

有时候我们可能从项目中删除了某个目录.文件以后,编译出现警告信息: ld: warning: directory not found for option“XXXXXX” 具体类似下图: 很奇怪,为什 ...

linux0.12 解决编译问题常用命令

解决编译问题时,经常需要修改所有的Makefile,特别定义了下面几条命令方便修改. function msed() { find -name "Makefile" -exec s ...

16种C语言编译警告(Warning)类型的解决方法

当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译程序给出的每个警告 ...

在VS中使用Boost库出现Macro redefinition错误的解决方法(warning C4005)

最近使用Boost库做多线程开发,可视在vs中编译工程师总是遇到Macro redefinition错误,类似下面的错误描述 1>c:\program files (x86)\microsoft ...

C语言 消灭编译警告(Warning)

如何看待编译警告 当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译 ...

App开发流程之使用分类(Category)和忽略编译警告(Warning)

Category使得开发过程中,减少了继承的使用,避免子类层级的膨胀.合理使用,可以在不侵入原类代码的基础上,写出漂亮的扩展内容.我更习惯称之为"分类". Category和Ext ...

随机推荐

Visual Studio 中的头文件、源文件和资源文件都是什么?有什么区别??

头文件:后缀为.h,主要是定义和声明之类的,比如类的定义,常量定义源文件:后缀.cpp,主要是实现之类的,比如类方法的实现资源文件主要是你用到的一些程序代码以外的东西,比如图片之类,或者菜单.工具栏之 ...

plsql programming 04 条件和顺序控制

1. 条件语句 if salary > 40000 or salary is NULL then give_bonus(employee_id, 500); end if; if conditi ...

Tomcat中的线程池StandardThreadExecutor

之所以今天讨论它,因为在motan的的NettyServer中利用它这个线程池可以作为业务线程池,它定制了一个自己的线程池.当然还是基于jdk中的ThreadExecutor中的构造方法和execut ...

【HDOJ】1403 Longest Common Substring

后缀数组2倍增可解. #include #include #include #define MAXM 28 ...

安装 CocoaPods & Alcatraz

(一)安装CocoaPods { CocoaPods :} 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使 ...

Linux_System2

1.从服务器下载http*.tar.gz源码包,安装到/usr/local/apache目录下,要求安装时指定能够动态加载模块,能够支持地址回写功能,能够使用ssl加密功能../configure — ...

android TextView实现滚动显示效果

在android中,如果设置了TextView控件为单行显示,且显示的文本太长的话,默认情况下会造成显示不全的情况,这种情况下我们需要设置该控件属性如下:

[转]为什么复制构造函数的参数需要加const和引用

[转]为什么复制构造函数的参数需要加const和引用 一.引言 1.0在解答这个问题之前,我们先跑个小程序,看下调用关系. #include using namesp ...

2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践

2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...

解决键盘输入被JDB占用的问题

解决键盘输入被JDB占用的问题 本周的任务"迭代和JDB"在使用JDB调试时需要键盘输入数据,但我在正确的位置输入数据后发现JDB提示如图所示的错误. 上网查找后得知该错误的产生是 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值