extern "C"
От: sq-Weezee  
Дата: 17.12.08 05:52
Оценка:
Доброго сем.

Народ, такая проблема: создаю в студии проект dllки и при написании например:
extern "C" {

    

    void __declspec (dllexport) function1() {

        ...

    }

    

}


студия ругается:

error C2059: syntax error : 'string'...

Помогите плз)
Re: extern "C"
От: Arsenicum Россия  
Дата: 17.12.08 09:05
Оценка:
Здравствуйте, sq-Weezee, Вы писали:

...
SW>студия ругается:
SW>error C2059: syntax error : 'string'...
...

У вас не определён "string". Включая телепатию, предположу что это std::string из стандартной библиотеки. Этот класс включён в пространство имён std, и вам нужно указать, что он берётся именно от туда.
Или перед первым использованием (обычно в начале файла) написать:
using namespace std;

или везде заменить string на std::string.

P.S. Плохо заданный вопрос...
Re[2]: extern "C"
От: Аноним  
Дата: 17.12.08 09:29
Оценка:
Здравствуйте, Arsenicum, Вы писали:

A>Здравствуйте, sq-Weezee, Вы писали:


A>...

SW>>студия ругается:
SW>>error C2059: syntax error : 'string'...
A>...

A>У вас не определён "string". Включая телепатию, предположу что это std::string из стандартной библиотеки. Этот класс включён в пространство имён std, и вам нужно указать, что он берётся именно от туда.

A>Или перед первым использованием (обычно в начале файла) написать:
A>
A>using namespace std;
A>

A>или везде заменить string на std::string.

A>P.S. Плохо заданный вопрос...


Сорри, вопрос действительно задан плохо. Нужно написать dllку. Создаю проект в студии, прикрепляю файл, вида:

main.c


#include <windows.h>

extern "C" 
{

    void __declspec(dllexport) testfunction() 
    {
        MessageBox(NULL, "test message", "test title", 0);
    }
}



int WINAPI DllMain(HINSTANCE, DWORD, LPVOID) 
{
    return 0;
}


и компилятор ругается на строчку:

extern "C"


как:

error C2059: syntax error : 'string'

STL тут не используется

Собственно возникает вопрос, нужно ли менять какие либо настройки в студии, чтобы номано компилировалось или что я делаю не так?
Re[3]: extern "C"
От: Аноним  
Дата: 17.12.08 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Собственно возникает вопрос, нужно ли менять какие либо настройки в студии, чтобы номано компилировалось или что я делаю не так?

Странно... проверил в 2003-й и 2008-й студиях — все компилируется. Выложи что ли минимальный тестовый проект с ошибкой. Может у тебя в строке "extern "C"" затесались левые символы (русские например), попробуй ее перепечатать.
Re[3]: extern "C"
От: Erop Россия  
Дата: 17.12.08 09:59
Оценка: 29 (1) +1
Здравствуйте, Аноним, Вы писали:

А>main.c



А>
А>extern "C" 

А>

В языке С так нельзя написать.
Хочешь писать на С++ заводи main.cpp
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: extern "C"
От: SleepyDrago Украина  
Дата: 17.12.08 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сорри, вопрос действительно задан плохо. Нужно написать dllку. Создаю проект в студии, прикрепляю файл, вида:


А>main.c


А>и компилятор ругается на строчку:


А>
А>extern "C"
А>


А>как:


А>error C2059: syntax error : 'string'


А>STL тут не используется


А>Собственно возникает вопрос, нужно ли менять какие либо настройки в студии, чтобы номано компилировалось или что я делаю не так?


Вы или компилируйте как С++ и тогда вам понадобится extern "C" или уберите его и компилируйте как С
Re[3]: extern "C"
От: MShura  
Дата: 17.12.08 10:44
Оценка:
А>Сорри, вопрос действительно задан плохо. Нужно написать dllку. Создаю проект в студии, прикрепляю файл, вида: main.c
А>Собственно возникает вопрос, нужно ли менять какие либо настройки в студии, чтобы номано компилировалось или что я делаю не так?

Если не хочешь переименовывать файл в cpp, то добавь ключ /TP всему проекту или /Tp файлу main.c
Re: extern "C"
От: Аноним  
Дата: 17.12.08 15:18
Оценка:
всем пасиба, нужно именно на С, думал что в C(не С++) запись корректна, оказалось нет.
Re[2]: extern "C"
От: ДимДимыч Украина http://klug.org.ua
Дата: 17.12.08 16:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>всем пасиба, нужно именно на С, думал что в C(не С++) запись корректна, оказалось нет.


Для двуязычных заголовочных файлов можно писать
#ifdef __cplusplus 
extern "C" { 
#endif
...
#ifdef __cplusplus 
}
#endif
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: extern "C"
От: Tilir Россия http://tilir.livejournal.com
Дата: 18.12.08 11:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>main.c


На мой взгляд хороший выход из ситуации использовать макрос __cplusplus (VC-specific, но никто же не мешает и на других компиляторах определять такой при компиляции как C++)

#include <windows.h>

#ifdef __cplusplus
extern "C" 
{
#endif

    void __declspec(dllexport) testfunction() 
    {
        MessageBox(NULL, "test message", "test title", 0);
    }
#ifdef __cplusplus
}
#endif

int WINAPI DllMain(HINSTANCE, DWORD, LPVOID) 
{
    return 0;
}
Re[4]: extern "C"
От: Erop Россия  
Дата: 18.12.08 12:47
Оценка:
Здравствуйте, Tilir, Вы писали:

T>На мой взгляд хороший выход из ситуации использовать макрос __cplusplus (VC-specific, но никто же не мешает и на других компиляторах определять такой при компиляции как C++)

1) если надо писать с-программу, то на кой его использовать? Ты думаешь main.c когда-то будут компилировать как С++? Интересно, зачем?
2) Вообще-то макрос вроде бы стандартный а не MS-spec
3) И аналогичный совет в этой ветке уже давали, кстати.

ТАК ВОТ, ВАЖНО ЗАМЕТИТЬ, что макрос __cplusplus обычно используют В ХЕДЕРАХ. Просто потому, что хедеры могут включаться из С и из С++ кода.
А *.с, а тем более main.c обычно так не делают
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.