ファイルシステムの破損?、付記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 directiveとは、書かれたスコープに、指定された名前空間スコープ内の名前を持ち込むものである。
// usingディレクティブ
namespace NS { int x ; }
void f()
{
using namespace NS ;
x ; // well-formed, NS::x
}
当然、usingディレクティブで指定する名前は、名前空間名である。stdは名前空間名である。std::vectorは名前空間名ではない。
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