-1

C スタイルのコードを C++ で実行しようとしていますが、コンパイラで次のエラーが発生します。

5 行目: エラー: 文字列定数の前に unqualified-id が必要です

2 番目: 私の目標は、「行 d」のエラーを理解することです。

using namespace std;
typedef int (*pfun)(int);        // line a
int main()
{
    extern "C" void foo(pfun);   // line b
    extern "C" int g(int);       // line c 
    foo( g );                    // line d, Error

    return 0;
}
4

2 に答える 2

5

extern "C" 行をグローバル スコープに移動する必要があります。

    #include <cstdlib>

    using namespace std;

    typedef int (*pfun)(int);        // line a

    extern "C" void foo(pfun);       // line b
    extern "C" int g(int);           // line c

    int main(void)
    {
        foo( g );                    // line d, Error

        return 0;
    }        
于 2013-08-03T01:36:38.773 に答える
3

エラーは行 d にはありませんが、リンケージ仕様( extern "C")を使用しているためです。

セクション7.5.4の下:

リンケージ仕様は、名前空間スコープでのみ発生する必要があります

これは、C 関数で非常に一般的なグローバル名前空間に関数を移動できることを意味します。

typedef int (*pfun)(int);    // line a
extern "C" void foo(pfun);   // line b
extern "C" int g(int);       // line c 

int main()
{
    foo(g);                  // line d
    return 0;
}

または、名前付き名前空間内:

namespace c_funcs
{
    typedef int (*pfun)(int);    // line a
    extern "C" void foo(pfun);   // line b
    extern "C" int g(int);       // line c 
}

int main()
{
    c_funcs::foo(c_funcs::g);    // line d
    return 0;
}

...しかし、コードが行っているように、関数スコープではありません。

fooリンケージ仕様が入れ子になっているので、g「C」リンケージを与えるために、このような奇妙なことをすることさえできます:

typedef int (*pfun)(int); // line a

extern "C" int main()
{
    void foo(pfun);       // line b
    int g(int);           // line c 

    foo(g);               // line d

    return 0;
}
于 2013-08-03T01:41:38.323 に答える