C++ 大写字母使用C++;预处理器(x->;getX/setX)

C++ 大写字母使用C++;预处理器(x->;getX/setX),c++,c-preprocessor,C++,C Preprocessor,我想定义一些属性,如: #define property(T, x) T x; T get ## x (); void set ## x (T value); class foo { public: property(int, count); property(float, size); } 但是我希望方法被称为getCount/setCount,而不是getCount/setCount。使用C预处理器无法(据我所知)实现这一点。我建议折衷一下,使用下划线并使用易于阅读的get\

我想定义一些属性,如:

#define property(T, x) T x; T get ## x (); void set ## x (T value);

class foo { 
public: 
  property(int, count);
  property(float, size);
}
但是我希望方法被称为getCount/setCount,而不是getCount/setCount。

使用C预处理器无法(据我所知)实现这一点。我建议折衷一下,使用下划线并使用易于阅读的
get\u count()
。其他备选方案:

  • 如果你真的想继续使用前置处理器,你可以先研究使用
    m4
    。使用
    m4
    是完全可能的,因为我做了一些非常类似的事情。也就是说,对于你想要实现的目标来说,这似乎有点复杂
  • 添加一个额外的参数,以便获得
    #define property(T,x,name)
    ,该参数允许您单独指定名称。它更灵活,但也可能不是你想要的
  • 如果这真的只是创建访问器/变异器的工作,那么有很多IDE和代码生成器可以为您完成这项工作,或者您可以编写一些shell/Python/Perl来轻松完成这项工作

最后两个观察结果:尽管以这种方式编写代码似乎更为有效,但请记住,任何维护代码的人都可能会搜索
setCount()
,而没有找到它,这将浪费时间,直到他们弄清楚您做了什么。也就是说,从代码维护的角度来看,保持简单。其次,用大写字母表示宏是一种很好的做法,因为这样宏很容易识别。同样,当您维护代码时,这真的很有帮助。

正如评论所说,您不能这样做。预处理器不做这些事情

因此,要么你按照@Shahbaz在第一条评论中所说的做,要么像这样做,给出get和set的
get\u count
set\u count
形式

#define property(T, x) private : T m_## x; \
public : T get_## x () { return m_## x;} \
void set_## x (T value) { m_## x = value; }

class foo { 
public: 
  property(int, count);
  property(float, size);
};

int main() {
        foo f;
        f.set_count(10);
        std::cout << f.get_count() << std::endl;
        return 0;
}

如果这样做,则可以创建变量
m_Count
,函数为
getCount
setCount
。这是最接近你想要的

那是不可能的。您可以更改宏:
property(int,count,count)
(或
property(int,c,c,ount)
以最小化重复(不要这样做,这是个玩笑))这不是Java。在接受C++风格中,函数应该命名为“代码> GETX x())/<代码> > SETIX()<代码>(除了长度或计数应该命名为代码>()/<代码>和<代码> RESSIZE()/代码>。如果-正如您的宏建议的那样,您的变量是公共的,为什么要使用访问器?@ BeoVigt,它不是标准。虽然我个人更喜欢
\uu
,但camelCase或
\u
是程序员的风格选择。简单的回答是它不受支持。预处理器不包括任何更改标识符中字母大小写的功能。不管怎么说,你在追逐一条死胡同。套用Niklaus Wirth的话:“如果你认为你需要属性,你真正需要的是学习如何编程。”
 property(int, Count);