C ++使用#define访问struct?

时间:2013-12-19 08:35:15

标签: c++ c-preprocessor

我正在测试一些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

任何人都可以帮我吗?

2 个答案:

答案 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回到他的脸上,并告诉他要正确和干净。你不会让他们不得不应对你现在遇到的同样(和更多)问题,你将会帮助那些将来与之有关的人。你甚至可以帮助自己,虽然他一开始可能没有注意到:他有机会学习和提高并且不会受到其他程序员的诅咒。