6

今後の 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は 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++ に同意します。

4

1 に答える 1

3

はい、すべてのオーバーロードをグローバル名前空間に入れる必要があります。私の理解では、math.hヘッダーは次のようになります。

// math.h:
#include <cmath>

using std::abs;
// etc.

そうです。サンプル プログラムの動作は、C プログラムとしてコンパイルされた場合と、C++ プログラムとしてコンパイルされた場合とでは異なります。C++ プログラムとして、std::abs(double)から呼び出します<math.h>。C プログラムとして呼び出します(Cabs(int)は関数のオーバーロードをサポートしていないため、これは C 標準ライブラリ<stdlib.h>の唯一の関数です)。abs

于 2010-12-10T05:17:47.163 に答える