C ++標準17.6.1.2段落4(私の強調):
第18条から第30条および付属書Dに記載されている場合を除き、各ヘッダーの内容は、C標準ライブラリ(1.2)またはC Unicode TRで指定されているようcname
に、対応するヘッダーの内容と同じである必要があります。name.h
包含。ただし、C ++標準ライブラリでは、宣言(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.6)内にありますstd
。 これらの名前が最初にグローバル名前空間スコープ内で宣言され、次にstd
明示的なusing-declarations(7.3.3)によって名前空間に挿入されるかどうかは指定されていません。
g ++は後者の方法で実行するため、同じヘッダーファイルの一部をCおよびC++で再利用できます。したがって、g++はdouble log(double)
グローバル名前空間で宣言および定義できます。
セクション17.6.4.3.3パラグラフ3および4:
外部リンケージで宣言された標準Cライブラリの各名前は、名前空間とグローバル名前空間のextern "C"
両方でリンケージ付きの名前として使用するために実装に予約されています。std
外部リンケージで宣言された標準Cライブラリの各関数シグニチャは、extern "C"
とextern "C++"
リンケージの両方を持つ関数シグニチャとして、またはグローバル名前空間の名前空間スコープの名前として使用するために実装に予約されています。
そして、セクション17.6.4.3パラグラフ2の上部にあります。
プログラムが、この句で明示的に許可されている場合を除き、予約されているコンテキストで名前を宣言または定義する場合、その動作は未定義です。
一方、あなたはいかなる方法でも宣言または定義することはできません::log
。
ただし、g++ツールチェーンでエラーメッセージが表示されないのは残念です。