Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492

В чем ошибка при объявлении функции, как extern C?

15.05.2025, 21:55. Показов 4328. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
В заголовочном файле MemoryManager.h есть ряд объявлений типа:
C
1
 extern "C" void* m_alloc(int mem_size);
Они нужны, т.к. планируются их вызовы из библиотеки на С.

Везде в них компилятор (VS 2019) дает ошибки - см. скриншот.
Строки 6-37, а также строка 45 и далее - полностью закомментированы.

В файле MemoryManager.cpp для каждой такой процедуры написана реализация без указания extern "C" (думаю, это неважно - ведь ошибка в .h).

Вопрос: в чем причина ошибки ?

(про extern почитал, написал, похоже, правильно... или нет ?)

PS: "C" - английская
Миниатюры
В чем ошибка при объявлении функции, как extern C?  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2025, 21:55
Ответы с готовыми решениями:

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

Объявлении глобальной переменной extern int
при объявлении глобальной переменно extern int t, ошибки undefined reference to `t'. А если я...

Глобальное объявление класса в qt. extern
Здравствуйте интересует такой вопрос как глобально объявить класс с помощью extern. Много всего...

7
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,467
15.05.2025, 22:13
LUN2,
Возможно стоит что нибудь наподобие моего кода сделать - то есть в отдельный блок всё добавить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include "libavcodec/avcodec.h" 
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavfilter/version.h>
    
 
#include <libavutil/timestamp.h>
}
По крайней мере этот вариант у меня в коде точно работал
1
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
15.05.2025, 22:14
LUN2, ошибка не в коде, а в самой VisualStudio
В ней на коды ошибок начинающиеся с E - зачастую ошибка в анализаторе кода, а не в коде.
1
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492
15.05.2025, 22:38  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
LUN2,
Возможно стоит что нибудь наподобие моего кода сделать - то есть в отдельный блок всё добавить:
Recrut_rf, я и так попробовал:

C++
1
2
3
extern "C" {
#include "MemoryManager.h"
}
НО:
1) если я это делаю из заголовочного файла к .cpp, то этот вариант (обертывание инклуда) работает.
2) если из заголовочного файла к .c - также дает ошибку.

Проблема в том, что эти ф-ции используются как из C, так и из C++ - не удается пока сделать, чтобы и туда и туда мой .h включался нормально.

Добавлено через 2 минуты
Цитата Сообщение от Max Dark Посмотреть сообщение
LUN2, ошибка не в коде, а в самой VisualStudio
В ней на коды ошибок начинающиеся с E - зачастую ошибка в анализаторе кода, а не в коде.
Max Dark, и что же тогда, очень интересно, делают ?
Подозреваю, что VS 2019 не только я использую, и extern не такая редкая вещь, чтобы она годами не исправлялась (как мне кажется).
Хотите сказать, что кроме как обновлением версии это не исправить ?
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,467
15.05.2025, 22:43
LUN2, неее - надо свои функции добавить туда, где у меня инклуды
в промежуток между фигурными скобками

C++
1
2
3
4
extern "C"
{
ТУТ ОБЪЯВЛЕНИЯ ФУНКЦИЙ
}
Добавлено через 1 минуту
https://learn.microsoft.com/ru... clarations
1
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492
15.05.2025, 22:48  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
LUN2, неее - надо свои функции добавить туда, где у меня инклуды
в промежуток между фигурными скобками
Recrut_rf, тогда не понял - мои объявления и сидят в файле .h

Чем тогда мой вариант отличается от Вашего ?
0
1481 / 495 / 73
Регистрация: 22.09.2023
Сообщений: 1,566
15.05.2025, 22:50
Лучший ответ Сообщение было отмечено LUN2 как решение

Решение

Цитата Сообщение от LUN2 Посмотреть сообщение
т.к. планируются их вызовы из библиотеки на С.
C
1
2
3
4
5
6
7
8
9
10
#ifdef __cplusplus
extern "C"
{
#endif
 
ТУТ ОБЪЯВЛЕНИЯ ФУНКЦИЙ
 
#ifdef __cplusplus
}
#endif
1
-23 / 4 / 0
Регистрация: 15.08.2014
Сообщений: 492
15.05.2025, 23:02  [ТС]
Dushevny, да, это то что надо было!
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2025, 23:02
Помогаю со студенческими работами здесь

Multiple definition ошибка, использую extern
Доброго времени суток. Столкнулся с проблемой, описанной в шапке темы. Замысел заключается в...

Ошибка с extern
//main.cpp #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const int MAPW = 30;...

Ошибка: [Error] expected initializer before 'extern' в файле _mingw_secapi.h
Компилятор ругается на 44 строку. Читал об этой ошибке - в основном происходит если выше забыли &quot;;&quot;...

Опишите функцию extern в Си, её аргументы, назначение и что возвращае
Опишите пожалуйста функцию extern в Си, её аргументы, назначение и что возвращает. Не могу найти...

Использование extern с функциями
Добрый вечер! Скажем я задекларировал в каком-то модуле функцию extern void foo() ;. Но не...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru