问题:
环境:ubuntu 12.04,g++版本4.6.3,编译目标文件时出现warnings:
[plain] view plaincopyprint?
- 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中,
[cpp] view plaincopyprint?
- 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中定义的顺序不一致。
将其中的两行
[cpp] view plaincopyprint?
- 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) { }
[cpp] view plaincopyprint?
- 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) { }
[plain] view plaincopyprint?
- 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