Mar*_*ark 5 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);
}
Run Code Online (Sandbox Code Playgroud)
但我希望方法被称为getCount/setCount而不是getcount/setcount.
正如评论所说,你不能这样做.预处理器不会做那些事情.
所以你要么遵循@Shahbaz在第一篇评论中所说的内容,要么做一些这样的事情,它会让你得到和设定get_count和set_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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,变量在private节中声明,其名称为m_count,并且在节中定义(不仅声明)函数public.
或者,您可以传递Count而不是count在宏中:
property(int, Count);
Run Code Online (Sandbox Code Playgroud)
如果你这样做,那么你可以创建变量as m_Count和函数as getCount和setCount.那是最接近你想要的.
(据我所知)无法使用 C 预处理器来做到这一点。我建议作为折衷方案,您使用下划线并使用get_count()易于阅读的内容。其他替代方案:
m4首先研究一下使用。这绝对是可能的,m4因为我也做过类似的事情。也就是说,这对于您想要实现的目标来说似乎有点复杂。#define property(T, x, name)单独指定名称。它更灵活,但可能不是您想要的。最后两个观察结果:虽然以这种方式编写代码可能看起来更有效,但请记住,维护您的代码的任何人很可能会进行搜索setCount()但找不到它,这会浪费时间,直到他们弄清楚您做了什么。即从代码维护的角度来看,保持简单。其次,最好用大写字母表示宏,因为这样就很容易识别它们。同样,这在您维护代码时确实很有帮助。