今後の C++0x 標準の委員会の最終草案では、次のように述べられています。
それぞれが name.h という形式の名前を持つすべての C ヘッダーは、対応する cname ヘッダーによって標準ライブラリ名前空間に配置された各名前がグローバル名前空間スコープ内に配置されているかのように動作します。これらの名前が最初に名前空間 std の名前空間スコープ (3.3.6) 内で宣言または定義され、次に明示的な using 宣言 (7.3.3) によってグローバル名前空間スコープに注入されるかどうかは未指定です。
以前の C++ 標準も同様に読みます。
私の質問は、C++ ヘッダーがオーバーロードされた関数を使用する場合、オーバーロードは個別の「名前」ではないため、#include<cname>
すべてのオーバーロードが によって取り込まれるのでしょうか?#include<name.h>
また、次のコードの動作は、標準に準拠した C コンパイラと C++ コンパイラの間で異なる必要がありますか?
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
double arg = -2.5;
double result = abs(arg) / 3;
printf("%f\n", result);
return 0;
}
コンパイル可能なテスト ケース:
- C++
math.h
およびstdlib.h
: http://ideone.com/pmD4t - C
math.h
とstdlib.h
: http://ideone.com/Sflpn - C++
cmath
およびcstdlib
: http://ideone.com/yI07m - C++
cmath
のみ: http://ideone.com/KrS3W
このテストから、C++math.h
は C のように動作し、 C++ のようには動作しませんcmath
。
ただし、Visual C++ 2010 では、C++は C++math.h
のように動作しますcmath
。
そして、Comeau try-it-outで使用するコンパイル時のカナリア:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
template<typename T> struct typecheck {};
template<> struct typecheck<int> { enum { value = 1 }; };
template<typename T>
typecheck<T> f(const T& t) { return typecheck<T>(); }
int main(void)
{
double arg = -2.5;
auto result = abs(arg) / 3;
printf("%d\n", f(result).value);
return 0;
}
結果:
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 15: error: class "typecheck<double>" has no member "value"
printf("%d\n", f(result).value);
^
1 error detected in the compilation of "ComeauTest.c".
コモーは、Visual C++ に同意します。