Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов С-функции в С++ 
V
    Опции темы
fear
Дата 6.9.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Как правильно реализовать вызов С-функции из С++ файла? В примере приведённом ниже, возникает ошибка LNK1120: 1 unresolved externals, как разрешить?

Код

//// main.cpp
#include <iostream>
#include "hello.h"

using namespace std;

void main()
{
  cout<<hello()<<endl;
}

Код

//// hello.h
#ifndef HELLO_H
#define HELLO_H

int hello();

#endif

Код

//// hello.c
#include "hello.h"

int hello()
{
  return 5;
}


Код

error LNK2019: unresolved external symbol "int __cdecl hello(void)" (?hello@@YAHXZ) referenced in function _main
fatal error LNK1120: 1 unresolved externals


Это сообщение отредактировал(а) fear - 6.9.2007, 13:07
PM MAIL   Вверх
Sartorius
Дата 6.9.2007, 13:08 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 Что бы избежать декорирование имен используем extern "C" перед прототипом функции в C++  программе.
 
Код

//// hello.h
#ifndef HELLO_H
#define HELLO_H

extern "C" int hello();

#endif


PM MAIL ICQ   Вверх
Fazil6
Дата 6.9.2007, 13:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



файл реализации в проект включен?
PM MAIL   Вверх
fear
Дата 6.9.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата(Sartorius @ 6.9.2007,  13:08)
Что бы избежать декорирование имен используем extern "C" перед прототипом функции в C++  программе.
 
Код

//// hello.h
#ifndef HELLO_H
#define HELLO_H

extern "C" int hello();

#endif

И получаем в 5й строке ф-ла hello.h
Код

error C2059: syntax error : 'string'


Добавлено через 27 секунд
Цитата(Fazil6 @ 6.9.2007,  13:15)
файл реализации в проект включен?

да, включён
PM MAIL   Вверх
Sartorius
Дата 6.9.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



И получаем в 5й строке ф-ла hello.h

 error C2059: syntax error : 'string'

Ошибка очевидно возникает при компиляции C-ного проекта. Либо делаешь отдельный H-ник для C++. либо поступаешь так :
Код

//// main.cpp
#include <iostream>
extern "C"
{
#include "hello.h"
}

using namespace std;

void main()
{
  cout<<hello()<<endl;
}


 
PM MAIL ICQ   Вверх
fear
Дата 6.9.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Спасибо за помощь, выглядеть решение должно так:

Код

#ifndef HELLO_H
#define HELLO_H

#if defined(__cplusplus)
  extern "C" {
#endif

int hello();

#if defined(__cplusplus)
  }
#endif

#endif


Это сообщение отредактировал(а) fear - 6.9.2007, 13:41
PM MAIL   Вверх
akizelokro
Дата 6.9.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Подлинкуй hello.obj . И еще мне extern "C" не нравится в hello.h

Это сообщение отредактировал(а) akizelokro - 6.9.2007, 13:42


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
bsa
Дата 6.9.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(akizelokro @ 6.9.2007,  13:41)
Подлинкуй hello.obj . И еще мне extern "C" не нравится в hello.h

Посмотри стандартные заголовочные файлы, например stdio.h, которых входят в комплект стандартой библиотеки. Там увидишь именно такую конструкцию.
PM   Вверх
akizelokro
Дата 6.9.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Нужно проще. #include "hello.c" выбросить из main.cpp
вместо него вставить extern "C" int hello();
в самом "hello.h" убрать extern "C"

и не надо городить огород из дефайнов


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
bsa
Дата 6.9.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



akizelokro, что курил? Зачем придумывать какую-то фигню, когда есть стандартное решение?
PM   Вверх
akizelokro
Дата 6.9.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Зачем придумывать какую-то фигню, когда есть стандартное решение? 


А кой смысл тогда мотать в одном проекте вместе *.cpp и *.с?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 6.9.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  6.9.2007,  14:07 Найти цитируемый пост)
А кой смысл тогда мотать в одном проекте вместе *.cpp и *.с? 

Смысл бывает. Не надо ограничиваться исключительно своим опытом.


Цитата(akizelokro @  6.9.2007,  13:46 Найти цитируемый пост)
ужно проще. #include "hello.c" выбросить из main.cpp
вместо него вставить extern "C" int hello();
в самом "hello.h" убрать extern "C"

и не надо городить огород из дефайнов 

Угу. Теперь сделай то же самое, скажем, для windows.h. Выброси его include и понавтыкай два десятка "ручных" объявлений. Самое интересное начнётся, когда ты так сделаешь для десятка другого модулей, и тут, как бы невзначай, заголовочный файл, который ты так опрометчиво выкинул, изменит сигнатуры ф-ции.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 6.9.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Угу. Теперь сделай то же самое, скажем, для windows.h. Выброси его include и понавтыкай два десятка "ручных" объявлений. Самое интересное начнётся, когда ты так сделаешь для десятка другого модулей, и тут, как бы невзначай, заголовочный файл, который ты так опрометчиво выкинул, изменит сигнатуры ф-ции. 

Тут я не поспорю (редкий случай, отдохнуть чтоли надо? smile ). Стандартные библиотеки, кто же их править будет? Правда, возникает вопрос целесообразности (лени). В конкретном случае мне удобней пропечатать одну строчку вместо 7. В другом конкретном случае я бы подумал над более трудоемким решением. 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 6.9.2007, 14:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  6.9.2007,  14:53 Найти цитируемый пост)
Стандартные библиотеки, кто же их править будет?

Ну возьми нестандартную... Только чтобы там было(и исползовалось оттуда) более 20 ф-ций.
Да пусть даже одна ф-ция. Сегодня одна, а завтра две. Ну ладно, добавишь где надо вторую. Потом третью. Потом понеслась. Не проще ли с самого начала делать по человечески? Это не преждевременная пессемизация - это здравый смысл © Sutter.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.