2010-07-29

指定子の順番に意味はない

以下はすべて、まったく問題のないC++のコードである。

int typedef type ;
int f() { return 0 ; }
int extern f() ;

struct C
{
    int friend f() ;
    void virtual g() {}
} typedef * pointer ;

なぜなら、指定子には順番という概念がないからである。

ただし、指定子と宣言子の違いに注意しなければならない。

int typedef type ;

は問題ないが、

int * typedef type ;

これはエラーである。なぜならば、「*」は、指定子(specifier)ではなく、宣言子(declarator)だからである。

指定子と宣言子の区別は、通常のユーザーは知らなくてもいいことなので、普通の参考書は、typedef指定子を先頭に書いているのだろう。

これは、今、C++本の指定子について書いていて、thread_localとstaticの順番が関係ないので、そのことを解説しておこうと思って、気がついた。

void f()
{
    thread_local static int x ;
    static thread_local int y ;
}

そもそも、一般に、順番に意味のある指定子というものが見つからなかったので、わざわざthread_localとstaticについてだけ書くまでもないだろう。

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.