2013-08-03 2 views
-1

Я пытаюсь запустить C код стиля в C++ и мой компилятор дает следующее сообщение об ошибке:связывающая «C» код стиля в C++

Line 5: error: expected unqualified-id before string constant

Во-вторых, моя цель состоит в том, чтобы понять ошибку в строке» д».

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; 
} 
+0

'ехЬегп "C" Int х (INT)' и 'Int х (Int) 'не одни и те же типы. (C++ 11, 7.5/1) – cHao

ответ

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; 
    }   
3

Ошибка не находится на линии D, но с использованием спецификации в сцепления (The extern "C")

В соответствии с разделом 7.5.4 :

A linkage-specification shall occur only in namespace scope

Это означает, вы можете перенести свои функции в глобальное пространство имен, которое довольно часто используется для функций 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; 
} 
+0

Было бы лучше, если бы вы объяснили пространство имен, которое здесь применяется, а также область. Благодаря! –

+0

Пространство имен здесь представляет собой пространство имен по умолчанию, которое создается для каждой единицы перевода, и оно находится в области файлов, которые я предполагаю –