我遇到的问题与C ++中的样式有关,这是我目前正在自己的库中讨论的问题。 请考虑以下示例:
在库约定下,库中的所有内容都包含在具有库名称的命名空间中。假设它是lib
。现在,假设我们在该库中有一个模块,它有自己的命名空间和一系列类:
namespace lib
{
namespace a
{
class X;
class Y;
class Z;
}
}
现在通常如果我想访问类X
,我必须输入lib::a::X
,但这会在一段时间后变得乏味。由于我尝试将命名空间保持为尽可能本地化,因此我通常将using namespace lib::a;
放在我使用命名空间a
成员的函数的顶部。我的问题是:说而不是必须键入using namespace lib::a;
我在标题中定义了一个宏,如下所示:
#define USING_LIB_A_NS using namespace lib::a
然后我可以使用这个宏代替。使用它可能会产生任何潜在的问题吗?到目前为止我还没有找到,但我很想知道是否有任何潜在的问题。
答案 0 :(得分:1)
另一个建议:
namespace la=lib::a;
la::X x; // short, sweet and safe
表示您键入的金额与仍使用命名空间限定的安全性之间的良好折衷(从而避免命名冲突)。
E.g。很容易忘记std
定义left
和right
,这些是非常吸引人的名字,用于成员/功能,特别是如果你正在编码二叉树(这就是using namespace std;
如此皱眉的原因。)
鉴于您正在构建一个库,随着复杂性的增加,“常见的域特定术语”将被提升。将为您创建与您自己的条款冲突的机会 - 否则为什么需要区分lib::a
和lib::b
?
答案 1 :(得分:0)
我不建议使用
#define USING_LIB_A_NS using namespace lib::a
在您的代码中,使用
USING_LIB_A_NS;
与使用
完全不同using namespace lib::a;
后者更清晰,更可取。
只有在简化了更多代码的创建时,才能在C ++中使用宏。
答案 2 :(得分:0)
好吧,如果你确定定义了marco然后使用它就像你输入“using namespace”一样。
当你去编译你的程序时,有一个预处理步骤,preprocessor只是文本替换,即用文本替换marco。
所以,如果您有像
这样的代码#define PLUSFIVE(x) (x+5)
int main(int argv, char** argc){
std::cout << PLUSFIVE(4) << std::endl;
}
在预处理步骤之后,它看起来像
int main(int argv, char** argc){
std::cout << 4+5 << std::endl;
}
所以简而言之,没有区别。
答案 3 :(得分:0)
现代IDE为您提供自动填充和代码片段以及所有类型的小饰品,以减少繁琐的重复输入。现在,当你(或其他人)开始阅读代码时,丑陋的情绪发生了变化:花费很少时间进行输入可能需要花费很多时间来阅读和理解。因此,如果使用宏的唯一目标是减少键盘活动,我建议您在IDE中定义代码片段。
话虽如此,我认为这个宏没有破坏你的代码行为或类似的东西的实际危险 - 这只是一个风格问题。