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

Это элементарно контролируется сигнатурой и/или sizeof.

 

И вообще меня неправильно поняли - я не предлагаю тащить в С концепции С++, а лишь провожу аналогии - это все там и так есть, просто приглядитесь повнимательнее.

 

Сигнатура - проверка run-tmie + занимает ресурсы.

А про sizeof - не понял как его можно применять для котнтроля типа того, что нам передали по void указателю :unsure:

 

Так что не убедили :(

Нет в Си альтернативы С++ому контролю типов.

 

PS Откомпилируйте следующий пример Си компилятором и С++ компилятором. Почувствуйте разницу в строгости комиплятора

 

#include <stdio.h>

///@brief Overflow in initialization
char acBuf_[3] = "12345678";            // !!! Error in C++, Warinig in C

///@brief Function which change argument's value
void TestFun(int* piNum_)
{
(*piNum_) = 15;
}

////////////////////////////////////////
int main()
{
  volatile const int NUM = 1;
  TestFun(&NUM);                        // !!! Error in C++, Warinig in C

  printf("Num = %i\n", NUM);
  return 0;
}

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


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

По теме C vs C++ извините, но.. даже отвечать не хочу. На эту тему сломано столько копий, мама негорюй. Cам я использую все варианты - С, С++ и С# в зависимости от того что считаю лучшим для конкретной задачи (остновным критерием часто оказывается наличие в распоряжении готового кода). И ни спорить ни убеждать вас я ни в чем не собираюсь.

 

Но на тему комента "// !!! Error in C++, Warinig in C" все же скажу "А не надо писать так, что бы оставались ворнинги, ни в С ни в С++"- вот поспорьте лучше с этим утверждением. Хотя каюсь - сам грешу :)

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


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

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

 

1. Сделали велосипед...

2. Что-то не устойчив на дороге - прикрутили ещё 2 колеса...

3. Руль тяжеловато крутится - поставили баранку...

4. Крутить педали не хочется - поставили двигатель...

...

10. На голову капает.....

...

 

35. Ба.... да у нас машина получилась, правда чё-то корявая...

 

:)

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


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

Откомпилируйте следующий пример Си компилятором и С++ компилятором. Почувствуйте разницу в строгости комиплятора

Я, конечно, дико извиняюсь, но трудно привести пример еще более дурацкого "преимущества" :(, нежели Error/Warning. А если еще знать, что любым (по крайней мере я не знаю, каким нельзя) компилятором можно управлять уровнем Warning->Error. И вообще, нежели кто-то Warning-и отключает/игнорирует, то он сам себе Буратино :(.

Нет в Си альтернативы С++ому контролю типов

Ой, у современных 'C' компиляторов вполне разумно-сбалансированый контроль типов и то, что в C++ добавили немного паранои, типа

"а чего это вы тут void * пытаетесь инициализировать char *" ни есть ни особо плохо и ни особо хорошо.

Ну с этим

#include <stdio.h>
char acBuf_[3] = "12345678";            // !!! Error in C++, Warinig in C

соль совсем в другом месте, а именно в случае:

char acBuf_[3] = "123";

И

int x = '1234';

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


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

volatile const int NUM = 1;

Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile?

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


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

Если были групповые общие объявления, то я их делал в main, а в других объявлял как extern.

Я объявлял их там, где больше всего идет работа с ними. В остальных местах - extern. Если же такого факта не наблюдается, и частота использования переменных в нескольких местах примерно одинакова, то это выползают недостатки построения модулей. Тут словами делу не поможешь...

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


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

Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile?

Что вас так удивляет? Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора: например, регистр данных приемника UART'а. Чтение из него сбрасывает флаг прерывания от приемника. Т.е. чтение надо делать обязательно. Писать нельзя. Вот вам и const volatile. Обычная вещь.

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


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

Все на столько привыкли к препроцессору, что видимо призадумались.

И я в том числе :)

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


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

Структуры данных и передача указателей на структуры существенно помогают даже при их глобальности.

Я тоже широко использую препроцессор, но тут он бессилен что-нибудь сломать :)

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


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

Что вас так удивляет?
Меня удивляет, что в приведённом примере был не регистр...

Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора...
Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет).

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


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

Меня удивляет, что в приведённом примере был не регистр...

Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет).

 

Эта запись не запрещает меняться этой переменной. Она всего лишь запрещает ее менять в этой программе :biggrin:

 

А вообще - написал volatile, тк иначе компилятор оптимизировал обращение к переменной в printf

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


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

Я вот тут призадумался...

А как бы нам так объявить volatile const, чтобы получился тот-же эффект как от

#define XINTCNF2 ( *(volatile unsigned long *)(0x0B34) )

 

P.S. Оно то понятно, что можно привлечь линкер и соответствующую #pragma для указания адреса.

Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление)

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


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

Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление)

Еще и переносимее, т.к. #pragma компилерозависимая

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


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

Я вот тут призадумался...

А как бы нам так объявить volatile const, чтобы получился тот-же эффект как от

 

Тю :) Да все так же:

 

#define XINTCNF2 ( *(volatile unsigned long const *)(0x0B34) )

unsigned long foo(void)
{
  XINTCNF2=1; //Error[Pe137]: expression must be a modifiable lvalue
  return XINTCNF2; //OK
}

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


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

ю smile.gif Да все так же:

Ну я имел ввиду без использования препроцессора. "По правильному" :)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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