Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
1

Почему в билдер extern "C" не работает?

25.02.2012, 12:09. Показов 4068. Ответов 12
Метки нет (Все метки)

Привет всем, у меня вопрос, почему в билдер(XE2) extern linkage не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm47::Button2Click(TObject *Sender)
{
#if defined __cplusplus
       extern "C"{
#endif
        //тут код C
 
#if defined __cplusplus
       }
#endif
}
И выпадают ошибки:
[BCC32 Error] Unit47.cpp(170): E2215 Linkage specification not allowed
[BCC32 Error] Unit47.cpp(170): E2040 Declaration terminated incorrectly
[BCC32 Error] Unit47.cpp(177): E2139 Declaration missing ;
[BCC32 Error] Unit47.cpp(177): E2190 Unexpected }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2012, 12:09
Ответы с готовыми решениями:

Что означает extern "C" или extern "C++"?
Например такой код, extern "C" void f(); Или C++ вместо C. Что это означает и где это применяется...

Почему когда я включая си билдер пишется- "Error! Object.obj not found. Programm will be closed."
Почему когда я включая си билдер пишется- "Error! Object.obj not found. Programm will be closed."...

Почему не работает? Нужно чтобы генерировалось рандомно "Сок" или "Вино"
Random rand = new Random(); private void textBox1_TextChanged(object sender, EventArgs e) ...

Не могу понять почему не работает в первом кейсе "Suma modyley posle 0" и "Masiv 2(spo4atku parni pozicii)"
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h>...

12
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
25.02.2012, 12:42 2
вы неверно понимаете назначение данной конструкции. она употребляется с прототипами функций написанных на С. для кода она не употребляется - код С вы можете употреблять в программах без ограничений.
0
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.02.2012, 21:51  [ТС] 3
vxg,
Да да ето я понимею, но когда питаюс обявыть прототипы, да и без них выдает ошибок
0
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
25.02.2012, 23:36 4
каких ошибок? может не в этом дело
0
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
26.02.2012, 04:57  [ТС] 5
vxg,
[BCC32 Error] Unit47.cpp(170): E2215 Linkage specification not allowed
[BCC32 Error] Unit47.cpp(170): E2040 Declaration terminated incorrectly
[BCC32 Error] Unit47.cpp(177): E2139 Declaration missing ;
[BCC32 Error] Unit47.cpp(177): E2190 Unexpected }
Вот ошибки
0
117 / 74 / 6
Регистрация: 23.01.2012
Сообщений: 186
26.02.2012, 10:47 6
Может стоит этот код вынести из функции
C++
1
void __fastcall TForm47::Button2Click(TObject *Sender)
и разместить в начале модуля
1
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
26.02.2012, 14:06 7
вот это -
[BCC32 Error] Unit47.cpp(170): E2215 Linkage specification not allowed
- не та ошибка о которой я говорю
вопрос в том - что вы запихиваете в директиву extern "C" и почему же это оно не может без нее жить - как я понял без этой директивы у вас какие то ошибки
1
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
26.02.2012, 18:31  [ТС] 8
_engineer_,
Да, так уже работает, значит его в функцие нелзя использовать...


vxg,

Ето ошибка тоже из за того что ее нелзя использовать в функцие...

Спасибо всем

Добавлено через 2 часа 26 минут
Может ктото приведит пример, как вбилдер работает extern "C" ?

Я пытаюс так:
1. Создоваю .с файл с содержанием
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma hdrstop
#pragma argsused
 
#include <stdio.h>
#include <tchar.h>
extern int sum(int a, int b)
{
 int c = a + b;
  return c;
}
int _tmain(int argc, _TCHAR* argv[])
{
  sum(10,10);
    return 0;
}
потом пытаюс обявить прототип в проект, и использовать его... Но есть ощыбки...

C++
1
2
3
4
5
6
7
#if defined __cplusplus
extern "C"{
#endif
  int jami(int a, int b);
#if defined __cplusplus
}
#endif
Вот ощыбки:
[ILINK32 Error] Error: Unresolved external '_jami' referenced from C:\DOCUMENTS AND SETTINGS\ARES\MY DOCUMENTS\RAD STUDIO\PROJECTS\WIN32\DEBUG\UNIT47.OBJ
[ILINK32 Error] Error: Unable to perform link
0
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
27.02.2012, 13:07 9
extern "C" используется для линковки с библиотеками (не с файлами вашего проекта). я не понимаю что вы хотите сделать с extern "C"...

Добавлено через 47 секунд
ошибка которую вы привели говорит следующее - не могу найти функцию jami - где она у вас? ее нет
0
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
29.02.2012, 01:36  [ТС] 10
vxg,

Да, шас понял... С функцию, можно обявить в хедер:
extern.h:

C++
1
2
3
4
5
6
7
8
9
10
11
#ifdef __cplusplus
extern "C" {
#endif
int f(int a, int b)
{
 a += b;
 return a;
}
#ifdef __cplusplus
}
#endif
А в СРР файл его можно исползовать так:
C++
1
2
3
4
5
#include "extern.h"
//...
int s = f(10,10);
cout << s << endl;
//...
правилно понял?
0
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
29.02.2012, 07:52 11
в заголовочных файлах как правило не производится определения функции за исключением случаев когда это inline-функция (функция код которой будет автоматически подставлен вместо ее вызовов в код программы). традиционным способом объявления функций является размещение их прототипов в заголовочных файлах и их определение в CPP файлах. в другие модули из которых мы хотим получить доступ к функции вставляется ссылка на заголовочный файл при помощи директивы #include. ваш пример будет работать, просто он несколько выходит за рамки традиционных подходов к делению программы на модули. необходимости в директиве extern "C" в данном коде нет.
1
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
29.02.2012, 08:01  [ТС] 12
vxg,
Вот я задумываюс, вчем необходимость когда либо использовать extern "C" ?
0
Модератор
3352 / 2127 / 349
Регистрация: 13.01.2012
Сообщений: 8,290
29.02.2012, 22:59 13
в длл при экспорте функции без extern C не обойтись - имена испортятся
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.02.2012, 22:59
Помогаю со студенческими работами здесь

Почему не работает функция std::regex_replace(temp,"amp;","");
Пробую вызывать функцию std::regex_replace(temp,&quot;amp;&quot;,&quot;&quot;); Пишет ошибку: test_ok_ruDlg.cpp...

error LNK2001: unresolved external symbol "extern "C" int __stdcall
Доброй ночи всем программистам, у меня возникла проблема следующего характера: при добавлении в...

Error LNK2031: unable to generate p/invoke for "extern "C" enum CURLcode __clrcall curl_easy_setopt
Добрый вечер. Пишу код отправки POST-запроса через CURL. При компиляции появляется ошибка. ...

почему-то не работает кнопка "обновить" и "изменить"
я сделала кнопки в делфи,но у меня почему-то не работает кнопка &quot;обновить&quot; и &quot;изменить&quot; можете...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru