フォーラム: 開発者 (スレッド #21892)

スコープ解決演算子について (2009-03-03 12:22 by cielquis #42273)

「clxで、変数をホストのバイトオーダーからネットワークのバイトオーダーに
変換するhtons()というスタンダードライブラリにある関数を使用しているのですが、C++の名前空間の外側、つまり、大域的という事で、
::htons()
と、スコープ解決演算子::を使用しているのですが、darwinでは、これはマクロの為、エラーになっていました。Xcodeのビルドのプリプロセスで確認いたしました。」

http://qwik.jp/objc20-reading/30.html
上記への対応.

当初,大域空間で定義されている関数を呼び出すときは,::f() のような形で記述していたが,上記のような問題が発生するようなので f() と記述する事とする.比較的最近に実装したものは,上記のようなスコープ解決演算子は付けなくなっていたので,これを機に統一する事とする.

RE: スコープ解決演算子について (2009-03-15 00:02 by cielquis #42550)

何故グローバルな名前空間で定義されている関数を呼び出すときに,スコープ解決演算子を使用していたのかを思い出した.クラス内に同名のメソッドがある場合,引数が違ってもグローバル空間に定義されている関数を探しに行ってくれないからだった.

udp::socket, tcp::socket, tcp::acceptor, icmp::scoket, ssl::socket, ssl::acceptor 辺りでこの問題が出てくる.対象となる関数は,connect(), accept(), bind(), send(), recv() 辺り.

なので,以下の関数をコールするときはスコープ解決演算子を付ける事とする.
::connect(), ::bind(), ::listen(), ::accept(), ::send(), ::recv()
これ以外の関数のグローバル名前空間へのスコープ解決演算子は取り払う.尚,sendto() と recvfrom() は,send_to(), recv_from() のような規則でメソッド名を付けているのでこちらはスコープ解決演算子は付けない.
#42273 への返信