6

このコード標準は準拠していますか?

#include <stdio.h>
#include <cstdio>

int main() {
    FILE *f1 = 0;
    std::FILE *f2 = f1;
}

説明:標準には [headers] と記載されています。

[...] 各ヘッダーの内容はcname、対応するヘッダーの内容と同じでなければなりませんname.h[...] 包含によるかのように。ただし、C++ 標準ライブラリでは、宣言 [...] は名前空間の名前空間スコープ (3.3.6) 内にありますstdこれらの名前が最初にグローバル名前空間スコープ内で宣言され、次にstd明示的なusing 宣言(7.3.3) によって名前空間に挿入されるかどうかは指定されていません。

したがって、明示的な using 宣言によって注入されない場合、それらは異なる型である可能性がありますか? stdテキストの残りの半分は、名前が名前空間内にあることを要求するこの要件と明らかに矛盾しているため、「包含によるかのように」というフレーズは決定的ではないと思います。

4

3 に答える 3

3

はい、それは標準準拠です:は in 、inでFILE*宣言されており、引用した段落のために 2 つは同じです。stdio.hstd::FILE*cstdio

(指定されていないのは、 のみを含める場合、グローバル名前空間にも同じものがあるかどうかだけです。<cstdio>)FILE*


更新: 鼻の型実際には同じであり、各型は一度だけ宣言され、宣言を介して他の名前空間に注入されると思いますusing。指定されていない唯一のことは、どちらが最初に来るかです。対応する反対の標準引用符は D.5(2) です。

それぞれが name.h という形式の名前を持つすべての C ヘッダーは、対応する cname ヘッダーによって標準ライブラリ名前空間に配置された各名前がグローバル名前空間スコープ内に配置されているかのように動作します。これらの名前が最初に名前空間 std の名前空間スコープ (3.3.6) 内で宣言または定義され、次に明示的な using 宣言 (7.3.3) によってグローバル名前空間スコープに注入されるかどうかは指定されていません。

基本的に、これは 2 つの実装が可能であることを意味します。

「Cが最初に来ました」:

// foo.h

struct Gizmo { /* ... */ };

// cfoo

#include "foo.h"
namespace std { using ::Gizmo; }


"C 互換の C++:

// cfoo

namespace std 
{
    struct Gizmo { /* ... */ };
}

// foo.h

#include <cfoo>
using std::Gizmo;
于 2012-05-05T21:32:14.763 に答える
1

はい、それらは異なるタイプにすることができます。C++タイプを使用します。Cヘッダーは、互換性のためにのみ存在します。

上記の回答へのコメントが示唆しているように、C++ヘッダーがnamespace std { #include "stdio.h" };として実装されているかどうかを検討してください。次に::FILEstd::FILEさまざまなタイプを表します。

于 2012-05-05T21:24:47.310 に答える