|
|
  |
Объявления, Как принято делать, и кто как реально делает. |
|
|
|
Oct 15 2009, 08:42
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Flexz @ Oct 15 2009, 11:12)  Это элементарно контролируется сигнатурой и/или sizeof.
И вообще меня неправильно поняли - я не предлагаю тащить в С концепции С++, а лишь провожу аналогии - это все там и так есть, просто приглядитесь повнимательнее. Сигнатура - проверка run-tmie + занимает ресурсы. А про sizeof - не понял как его можно применять для котнтроля типа того, что нам передали по void указателю Так что не убедили  Нет в Си альтернативы С++ому контролю типов. 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; }
|
|
|
|
|
Oct 15 2009, 11:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Если бы изначально всё продумывалось, то такого бы не получилось, но вы же знаете как всё происходит... 1. Сделали велосипед... 2. Что-то не устойчив на дороге - прикрутили ещё 2 колеса... 3. Руль тяжеловато крутится - поставили баранку... 4. Крутить педали не хочется - поставили двигатель... ... 10. На голову капает..... ... 35. Ба.... да у нас машина получилась, правда чё-то корявая...
|
|
|
|
|
Oct 15 2009, 12:22
|

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

|
Цитата(Dima_G @ Oct 15 2009, 11:42)  Откомпилируйте следующий пример Си компилятором и С++ компилятором. Почувствуйте разницу в строгости комиплятора Я, конечно, дико извиняюсь, но трудно привести пример еще более дурацкого "преимущества"  , нежели 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';
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 16 2009, 03:08
|

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

|
Цитата(demiurg_spb @ Oct 15 2009, 22:42)  Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile? Что вас так удивляет? Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора: например, регистр данных приемника UART'а. Чтение из него сбрасывает флаг прерывания от приемника. Т.е. чтение надо делать обязательно. Писать нельзя. Вот вам и const volatile. Обычная вещь.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 16 2009, 20:25
|

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

|
Цитата(dxp @ Oct 16 2009, 07:08)  Что вас так удивляет? Меня удивляет, что в приведённом примере был не регистр... Цитата Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора... Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 17 2009, 08:07
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

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

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

|
Цитата Я вот тут призадумался... А как бы нам так объявить 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 }
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|