реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Объявления, Как принято делать, и кто как реально делает.
Dima_G
сообщение Oct 15 2009, 08:42
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Flexz @ Oct 15 2009, 11:12) *
Это элементарно контролируется сигнатурой и/или sizeof.

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


Сигнатура - проверка run-tmie + занимает ресурсы.
А про sizeof - не понял как его можно применять для котнтроля типа того, что нам передали по void указателю unsure.gif

Так что не убедили sad.gif
Нет в Си альтернативы С++ому контролю типов.

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;
}
Go to the top of the page
 
+Quote Post
Flexz
сообщение Oct 15 2009, 08:55
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



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

Но на тему комента "// !!! Error in C++, Warinig in C" все же скажу "А не надо писать так, что бы оставались ворнинги, ни в С ни в С++"- вот поспорьте лучше с этим утверждением. Хотя каюсь - сам грешу smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 15 2009, 11:53
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

1. Сделали велосипед...
2. Что-то не устойчив на дороге - прикрутили ещё 2 колеса...
3. Руль тяжеловато крутится - поставили баранку...
4. Крутить педали не хочется - поставили двигатель...
...
10. На голову капает.....
...

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

smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 15 2009, 12:22
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dima_G @ Oct 15 2009, 11:42) *
Откомпилируйте следующий пример Си компилятором и С++ компилятором. Почувствуйте разницу в строгости комиплятора

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

Ой, у современных 'C' компиляторов вполне разумно-сбалансированый контроль типов и то, что в C++ добавили немного паранои, типа
"а чего это вы тут void * пытаетесь инициализировать char *" ни есть ни особо плохо и ни особо хорошо.
Ну с этим
Код
#include <stdio.h>
char acBuf_[3] = "12345678";            // !!! Error in C++, Warinig in C

соль совсем в другом месте, а именно в случае:
Код
char acBuf_[3] = "123";

И
Код
int x = '1234';


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 15 2009, 15:42
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Dima_G @ Oct 15 2009, 12:42) *
Код
volatile const int NUM = 1;
Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 15 2009, 15:54
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(SasaVitebsk @ Oct 14 2009, 21:34) *
Если были групповые общие объявления, то я их делал в main, а в других объявлял как extern.

Я объявлял их там, где больше всего идет работа с ними. В остальных местах - extern. Если же такого факта не наблюдается, и частота использования переменных в нескольких местах примерно одинакова, то это выползают недостатки построения модулей. Тут словами делу не поможешь...
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 03:08
Сообщение #22


Adept
******

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



Цитата(demiurg_spb @ Oct 15 2009, 22:42) *
Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile?

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 16 2009, 06:23
Сообщение #23


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 16 2009, 19:46
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 16 2009, 20:25
Сообщение #25


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(dxp @ Oct 16 2009, 07:08) *
Что вас так удивляет?
Меня удивляет, что в приведённом примере был не регистр...
Цитата
Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора...
Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 17 2009, 08:07
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(demiurg_spb @ Oct 17 2009, 00:25) *
Меня удивляет, что в приведённом примере был не регистр...
Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет).


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

А вообще - написал volatile, тк иначе компилятор оптимизировал обращение к переменной в printf
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 17 2009, 12:48
Сообщение #27


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я вот тут призадумался...
А как бы нам так объявить volatile const, чтобы получился тот-же эффект как от
#define XINTCNF2 ( *(volatile unsigned long *)(0x0B34) )

P.S. Оно то понятно, что можно привлечь линкер и соответствующую #pragma для указания адреса.
Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление)


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 17 2009, 12:56
Сообщение #28


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sigmaN @ Oct 17 2009, 15:48) *
Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление)

Еще и переносимее, т.к. #pragma компилерозависимая
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 17 2009, 13:24
Сообщение #29


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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

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

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 17 2009, 15:58
Сообщение #30


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016