DimaG 0 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба Это элементарно контролируется сигнатурой и/или 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба По теме C vs C++ извините, но.. даже отвечать не хочу. На эту тему сломано столько копий, мама негорюй. Cам я использую все варианты - С, С++ и С# в зависимости от того что считаю лучшим для конкретной задачи (остновным критерием часто оказывается наличие в распоряжении готового кода). И ни спорить ни убеждать вас я ни в чем не собираюсь. Но на тему комента "// !!! Error in C++, Warinig in C" все же скажу "А не надо писать так, что бы оставались ворнинги, ни в С ни в С++"- вот поспорьте лучше с этим утверждением. Хотя каюсь - сам грешу :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба Если бы изначально всё продумывалось, то такого бы не получилось, но вы же знаете как всё происходит... 1. Сделали велосипед... 2. Что-то не устойчив на дороге - прикрутили ещё 2 колеса... 3. Руль тяжеловато крутится - поставили баранку... 4. Крутить педали не хочется - поставили двигатель... ... 10. На голову капает..... ... 35. Ба.... да у нас машина получилась, правда чё-то корявая... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба Откомпилируйте следующий пример Си компилятором и С++ компилятором. Почувствуйте разницу в строгости комиплятора Я, конечно, дико извиняюсь, но трудно привести пример еще более дурацкого "преимущества" :(, нежели 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'; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба volatile const int NUM = 1; Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 15 октября, 2009 Опубликовано 15 октября, 2009 · Жалоба Если были групповые общие объявления, то я их делал в main, а в других объявлял как extern. Я объявлял их там, где больше всего идет работа с ними. В остальных местах - extern. Если же такого факта не наблюдается, и частота использования переменных в нескольких местах примерно одинакова, то это выползают недостатки построения модулей. Тут словами делу не поможешь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 16 октября, 2009 Опубликовано 16 октября, 2009 · Жалоба Поделитесь пожалуйста сакральными знаниями, когда const может быть ещё и volatile? Что вас так удивляет? Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора: например, регистр данных приемника UART'а. Чтение из него сбрасывает флаг прерывания от приемника. Т.е. чтение надо делать обязательно. Писать нельзя. Вот вам и const volatile. Обычная вещь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 16 октября, 2009 Опубликовано 16 октября, 2009 · Жалоба Все на столько привыкли к препроцессору, что видимо призадумались. И я в том числе :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 16 октября, 2009 Опубликовано 16 октября, 2009 · Жалоба Структуры данных и передача указателей на структуры существенно помогают даже при их глобальности. Я тоже широко использую препроцессор, но тут он бессилен что-нибудь сломать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 16 октября, 2009 Опубликовано 16 октября, 2009 · Жалоба Что вас так удивляет?Меня удивляет, что в приведённом примере был не регистр... Представьте себе регистр только для чтения - регистр специальных функций (SFR) процессора...Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Меня удивляет, что в приведённом примере был не регистр... Да, за этот наглядный пример спасибо. А то меня как-то замкнуло на том, что const это константа и всё (т.е. её нельзя изменить и сама собой она не поменяется, а volatile тут сильно всё меняет). Эта запись не запрещает меняться этой переменной. Она всего лишь запрещает ее менять в этой программе А вообще - написал volatile, тк иначе компилятор оптимизировал обращение к переменной в printf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Я вот тут призадумался... А как бы нам так объявить volatile const, чтобы получился тот-же эффект как от #define XINTCNF2 ( *(volatile unsigned long *)(0x0B34) ) P.S. Оно то понятно, что можно привлечь линкер и соответствующую #pragma для указания адреса. Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Но как-то задефайнить привычнее и проще(даже тупо по кол-ву строк на одно объявление) Еще и переносимее, т.к. #pragma компилерозависимая Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба Я вот тут призадумался... А как бы нам так объявить 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 17 октября, 2009 Опубликовано 17 октября, 2009 · Жалоба ю smile.gif Да все так же: Ну я имел ввиду без использования препроцессора. "По правильному" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться