2015-09-27 64 views
-4

双undescores有任何技术原因,标准库(C或C++)实现到,IMO滥用,强调他们的方式(=前缀有两个undescore +家居添加一个结尾下划线来表示一个变量是一个成员变量)?原因四标准库的实现

我得到/.*__.*//_[A-Z].*/(< = regexes)是通过实现保留的。但是,这不是指应用编译器而是(标准)库吗?

不能一个标准库的行为就像在选择其内部名称方面的任何其他图书馆吗?

+1

这不是滥用,实现_shall_使用保留标识符。 – edmz

+8

标准库*是*“实施”的一部分。它在C和C++规范中与语言本身一样定义。 –

+0

这显然不是http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier的副本。这是关于stdlib实现中双重不良内容的原因是什么。 “尽管除非你是羊,否则这不是一个好理由。确保没有用户定义的具有合法标识符的宏将与stdlib标题冲突。 – PSkocik

回答

3

有一个很好的理由,标准库与两个下划线开始内部名称:这样的名称被保留用于执行。

试想一下,你写了下面的代码:

#include <iostream> 

using namespace std; 

long square(long x) 
{ 
    return x*x; 
} 

int main() 
{ 
    cout << square(3) << endl; 
} 

我猜你会不会很高兴,如果这最终调用执行标准库和做一些完全不同的使用一些内部功能square(int),因为它是一个更好的square(3)匹配比您的square(long)

通过与双下划线,并在同一时间的标准,宣布你不能做同样的前缀所有的内部名称,标准库的作者确保这样的事情不会发生。

现在你可以说<iostream>不是STL的一部分,但是每个标准库头可以包含任何其他标准库头,因此iostream可能包含一个STL头以供其实现使用。

另一个原因是双下划线标识即使在没有外部看到本地标识符的情况下作出的感觉是,你可能已经定义了一个同名的宏。试想一下:

#define value 15 

#include <iostream> 

int main() 
{ 
    std::cout << value; 
} 

这是合法的代码,当然应该输出15.但是现在想象一下,如果发生在iostream一些对象中声明的局部变量名value。你的代码显然不能编译。

注意,标准库是实现的一部分(它在C++标准银行所描述的,毕竟),因此是什么样子就可以使用保留名称。

+0

对不良问题的回答没有用。请阅读George Cummins的帖子[这里](https://meta.stackoverflow.com/questions/252506/question-quality-is-dropping-on-stack-overflow)。 – edmz

+0

有静态函数(=匿名命名空间函数)来防止在全局范围发生冲突。 std命名空间也会照顾到这一点。对于结构/类成员,这是私有的。在我看来,除了双倍的不满意之外,还有很多手段。 – PSkocik

+3

@black:这个问题显然不属于“机械特克”类别。我也不同意这是一个糟糕的问题。 – celtschk