我正在测试一些C ++代码。目前有一个问题我无法理解其起源。 代码是这样的:
typedef struct
{
UWORD tFollowUp_uw;
union
{
UBYTE Control_ub;
struct
{
BITFIELD8 Request_b1 :1;
}b_st;
}b_un;
}X_CONTROLS;
#define Request_b (Controls_st.b_un.b_st.Request_b1)
#define tFollowUp_uw (Controls_st.tFollowUp_uw)
class Class_T20
{
public:
X_CONTROLS Controls_st;
}
因此,当我测试这些LOC时,我首先声明一个对象Class_T20_obj
。
我只能通过调用Request_b1
Class_T20_obj.Controls_st.b_un.b_st.Request_b1
我无法通过调用tFollowUp_uw
Class_T20_obj.Controls_st.tFollowUp_uw
任何人都可以帮我吗?
答案 0 :(得分:6)
我无法通过调用
来访问变量tFollowUp_uw
Class_T20_obj.Controls_st.tFollowUp_uw
那是因为tFollowUp_uw
是一个邪恶的宏,所以这被转换为
Class_T20_obj.Controls_st.(Controls_st.tFollowUp_uw)
失败,因为Controls_st
没有名为Controls_st
的成员;还因为你不能在这样的成员名称周围加上括号。
从中删除流氓括号后,使用宏Class_T20_obj.tFollowUp_uw
;或者摆脱它。
答案 1 :(得分:0)
在你写的评论中,你想要访问变量。这很简单:
Class_T20_obj.Controls_st.b_un.b_st.Request_b1
好吧,写这个有点工作,但它在很多很多方面都比那个邪恶的宏更好。
如果它始终相同Class_T20_obj
,您可以通过声明引用来缩短它:
BITFIELD8& t20_Request_b = Class_T20_obj.Controls_st.b_un.b_st.Request_b1;
/* do something with t20_Request_b */
或者,如果您有类型Class_T20
的不同对象并想要访问该成员,请编写一个返回引用的函数:
BITFIELD8& get_Request_b(Class_T20& ct20) {
return ct20.Controls_st.b_un.b_st.Request_b1;
}
//later:
get_Request_b(Class_T20_obj) = someBitFieldValue;
你写的只是测试代码。如果代码的作者是外国人并且不在贵公司工作,请使用给定的解决方法之一。我把这个函数放在一个包含外国人标题的标题中,并带有你上面粘贴的定义,如下所示:
//myxcontrols.h
#include "HIS_XControls.h"
//get rid of the polluting evil macros, they don't work anyways
#undef Request_b
#undef tFollowUp_uw
//free accessor functions
BITFIELD8& get_Request_b(Class_T20& ct20) {
return ct20.Controls_st.b_un.b_st.Request_b1;
}
但是:如果编写该代码的人在您的公司并且您必须进行验收测试,请不接受它,抛出那个丑陋的crapcode回到他的脸上,并告诉他要正确和干净。你不会让他们不得不应对你现在遇到的同样(和更多)问题,你将会帮助那些将来与之有关的人。你甚至可以帮助自己,虽然他一开始可能没有注意到:他有机会学习和提高并且不会受到其他程序员的诅咒。