|
|
  |
еще раз об использовании СPP и uCOS |
|
|
|
May 18 2007, 07:35
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jurdens @ May 18 2007, 09:43)  Но почему С компилятор не ругался ? С++ более строг в смысле типов. Цитата(Jurdens @ May 18 2007, 09:43)  но может можно как то еще дать знать компилятору о том что 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)); }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 18 2007, 07:50
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Jurdens @ May 18 2007, 13:43)  Есть рабочий проект под 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), чтобы она не тащила за собой накладных расходов на вызов.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 18 2007, 09:12
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jurdens @ May 18 2007, 11:58)  Ну а если ,волею судеб, нужно вызвать функцию CPP или, не приведи господь, вызвать метод экземпляра класса в модуле С ? Это можно сделать? и как? Есть два пути - правильный и муторный. Правильный - перевести все С файлы на C++. Муторный - объявлять в .cpp обертки с атрибутом extern "C": extern "C" int MyCppFunc_wrapper(int arg) { return MyCppFunc(arg); } - так MyCppFunc_wrapper будет "виден" из С-файлов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 18 2007, 10:05
|
Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656

|
Цитата(Сергей Борщ @ May 18 2007, 12:12)  Есть два пути - правильный и муторный. Правильный - перевести все С файлы на 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 определяет компилятор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|