-1

我正在尝试在 C++ 中运行 C 样式代码,而我的编译器出现以下错误:

第 5 行:错误:字符串常量之前的预期 unqualified-id

第二:我的目标是理解“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

您需要将您的外部“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 行,而是在您使用了链接规范(the 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;
}

...但不在函数范围内,就像您的代码所做的那样。

链接规范嵌套,所以你甚至可以做一些奇怪的事情来给出foog“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 回答