本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

ファイルシステムの破損?、付記using宣言とusingディレクティブの違い

ここ最近、筆者の使っているコンピューターは不可解な挙動に見舞われてきた。再現性なく機能停止に陥るのだ。

機能停止、というのはなんとも大雑把な言葉だが、そうとしか表現しようのない状態になる。

何の前触れもなく、急に画面が真っ暗、あるいは単色になり、そのまま止まってしまう。ターミナルに切り替えることもできず、SysRqすらきかない。

しかし、Ubuntuのバグ報告をみても、それらしき現象はない。こんなにも頻繁に遭遇しているのに何故だろうか。ハードウェアの故障であろうか。

ところで、今日、不思議な現象に出くわした。bashのglob上からみると存在するはずのファイルが、なぜか実際には存在していないという現象である。つまり、echo *とlsで表示されるファイルが異なる。globからしか見えないファイルがある。不思議だ。例に再起動してみたが、やはりglobでしか見えないファイルがある。

はて・・・、これはいったい。

fsckでもかけてみようか。GNU/Linuxで起動時にfsckをかけるには、ルートディレクトリにforcefsckというファイルを作成すればよい。

sudo touch /forcefsck
shutdown -r now

fsckは一瞬で終わった。再起動後、glob経由でしか見えないファイルはなくなっていた。

いったい何だったのだろうか。さて、再現性なく発生する機能停止はなくなるだろうか、しばらく様子を見よう。

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。

今、N4064のPerfect Initializationを理解するのに手間取っている。

ドワンゴ社内の近所の席から、GCCでusing宣言が動かないという声を耳にして、そんなバカなとコードをみたところ、

using namespace std::vector ;

なるコードが書かれていた。これはusing directiveだ。

usingディレクティブ

using directiveとは、書かれたスコープに、指定された名前空間スコープ内の名前を持ち込むものである。

// usingディレクティブ
namespace NS { int x ; }

void f()
{
    using namespace NS ;
    x ; // well-formed, NS::x
}

当然、usingディレクティブで指定する名前は、名前空間名である。stdは名前空間名である。std::vectorは名前空間名ではない。

using宣言

using declarationとは、書かれたスコープに、指定された名前を持ち込むものである。

// using宣言
namespace NS
{
    int x ;
    int y ;
}

void f()
{
    using NS::x ;
    x ; // well-formed, NS::x
    y ; // ill-formed. 名前yは見つからない
}

当然、using宣言で指定する名前は、名前空間名であってはならない。

確かに、多くのプログラマは言語を表面的な理解だけで使っているし、それでいい。普通のプログラマーは規格の細部に関わるよりも、動くコードを書くことに注力するべきである。

実際、usingディレクティブとusing宣言は、どちらもusingキーワードを使うし、その意味も、スコープに名前を持ち込むという似通った性質を持つので、混同されやすいのだろう。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0