Перейти к содержанию
    

еще раз об использовании СPP и uCOS

Есть рабочий проект под uCOS на С

После того как я поставил в настройках проекта (среда IAR) галочку Extended Embedded C++

компилятор стал ругаться на все фрагменты содержащие строковые константы в параметрах функций

типа OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err); на параметр "Startup"

OS_StrCopy(s, "uC/OS-II: Vx.yy"); на параметр "uC/OS-II: Vx.yy"

 

Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "INT8U *" C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\NXP\LPC2138\IAR\OS-View-LCD\app.cpp 198

несоответствие типов все понятно

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

И что делать сейчас есть может какая директива компилятору ?

Можно конечно и так..

 

INT8U G1[]="Startup";

.

.

.

OSTaskNameSet(APP_TASK_GRAPHOUT_PRIO, G1, &err);

 

и получается

но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но почему С компилятор не ругался ?
С++ более строг в смысле типов.
но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?
Я бы пошел с другой стороны - сомнительно, что в тех местах, где вы сейчас передаете строку когда-нибудь вам потребуется передавать массив беззнаковых байтов. Поэтому просто поправьте описание (определение) функций OS_StrCopy и OSTaskNameSet. Если такой вариант вас не устраивает, то сделайте приведение типов:OS_StrCopy(s, (INT8U *)"uC/OS-II: Vx.yy");

 

P.S. Есть еще один вариант - в каком-нибудь хидере определите inline-функцию с таким же именем, но другим типом параметров. Например если у вас есть int StrLen(INT8U *str), то можете объявить

inline int StrLen(char const* str) { return StrLen(reinterpret_cast<INT8U*>(str)); }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть рабочий проект под uCOS на С

После того как я поставил в настройках проекта (среда IAR) галочку Extended Embedded C++

компилятор стал ругаться на все фрагменты содержащие строковые константы в параметрах функций

типа OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err); на параметр "Startup"

OS_StrCopy(s, "uC/OS-II: Vx.yy"); на параметр "uC/OS-II: Vx.yy"

 

Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "INT8U *" C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\NXP\LPC2138\IAR\OS-View-LCD\app.cpp 198

несоответствие типов все понятно

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

[...]

но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?

Ваш INT8U - это, видимо, unsigned char. В С++ char, signed char и unsigned char - это три разных типа. Кроме того, Вы пытаетесь передать в функцию, принимающую аргумент INT8U*, выражение типа const char*, т.е. константное выражение. А если фукнция внутри будет менять значения, переданные по указателю? Этого делать нельзя. Почему в С режиме компилятор не ругался на это, не знаю. Выйти из положения можно, применив ручное преобразование типов. Это можно сделать, если уверены, что негативных последствий не возникнет - тут (после приведения типов) вся ответственность за правильность работы на Вас. А еще лучше, написать свою функцию-обертку, в которую поместить вызов этой функции с ручным преобразванием типа - чтобы в коде не мельтешело это преобразование. Эту функцию-оберктку объявить встраиваемой (inline), чтобы она не тащила за собой накладных расходов на вызов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо мне подойдет приведение типов.

А вот еще одно

при вызове функций С в модууле CPP - в файле *.cpp

линкер ругается

Error[e46]: Undefined external "BSP_Init()" referred in app (

C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\

=>

нужно описывать функции С вызываемые из модулей CPP как extern "C"

в моем случае

extern "C" void BSP_Init(void )"

 

что то еще надо ? есть какие нибуть ньюансы использования С-функций в CPP-файлах.грабли ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Больше никаких граблей не замечено. extern "C" делает С функции видимыми для C++ на уровне linker'a.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а если ,волею судеб, нужно вызвать функцию CPP или, не приведи господь,

вызвать метод экземпляра класса в модуле С ? Это можно сделать? и как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а если ,волею судеб, нужно вызвать функцию CPP или, не приведи господь, вызвать метод экземпляра класса в модуле С ? Это можно сделать? и как?
Есть два пути - правильный и муторный. Правильный - перевести все С файлы на C++. Муторный - объявлять в .cpp обертки с атрибутом extern "C":

extern "C" int MyCppFunc_wrapper(int arg) { return MyCppFunc(arg); } - так MyCppFunc_wrapper будет "виден" из С-файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть два пути - правильный и муторный. Правильный - перевести все С файлы на C++. Муторный - объявлять в .cpp обертки с атрибутом extern "C":

extern "C" int MyCppFunc_wrapper(int arg) { return MyCppFunc(arg); } - так MyCppFunc_wrapper будет "виден" из С-файлов.

Понятно

 

Увидел интересный прием ,может кому пригодится, как скопом объявлять функции как внешние С

в зависимости от того куда попали в С-файл или CPP-файл , в заголовочном файле

#ifdef __cplusplus

extern "C" {

#endif

 

void MyFunc1(void );

void MyFunc2(char);

.

.

.

.

#ifdef __cplusplus

}

#endif

 

__cplusplus определяет компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увидел интересный прием...

Прием наистандартнейший, делать так безусловно надо. Еще сразу еще в заголовочный файл наистандартнейшую защиту от повторных влючений - думаю тоже легко найдете, как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увидел интересный прием ,может кому пригодится, как скопом объявлять функции как внешние С

в зависимости от того куда попали в С-файл или CPP-файл , в заголовочном файле

В файле yvals.h для этого объявлены удобные макросы _EXTERN_C и _END_EXTERN_C. yvals.h подключается через практически любой из библиотечных .h-файлов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот есть еще такой вариант (для ИАРа в остальных средах я не работал):

 

1. Слинковать библиотеку типа rtos.d90.

2. Подключить её к проекту

3. Сделать класс сRTOS - C++ обертку библиотеки. И использовать его во всех своих С++ проектах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...