Что такое void и volatile? - C (СИ)
Формулировка задачи:
Всем привет
Уже 2 недели по немного изучаю С по книге Герберта Шилдта. Дошел до 48 страницы (из 800 всей книги) Все оказалось очень просто и понятно, раз в 20 проще чем веб язык PHP. Особенно про типы данных, видимости переменных и прочее, стандарт и историю С89. Правда тяжело вникать в философские термины, типа "модификатор", "квалификатор", "идентификатор", "атомарность" и прочие. Приходиться смотреть в энциклопедии что это такое. Но некоторые просто вообще не понять. Что такое тип данных volatile? Это, приблизительно "переменная не имеющая значения". Что это за ужасный бред создателей стандарта С89? Как это можно понять? То есть надо писать, если ф-я не возвращает значения, вот так:
почему нельзя вот так написать:
без void? Это очень странно, как то? Это то же самое что выдавать паспорт человеку который ещё не родился.
Как может быть переменная которая не имеет значения? Переменная всегда должна иметь значение. Не бывает переменных без значения. То есть:
какая польза от ^ этой строчки? Где я могу использовать объявленную переменную i не имеющую значения? Это наверное любовь к порядку и полной ясности.
-
Далее на 47 странице идет объяснение квалификаторов const и volatile. С const все понятно, если есть в программе переменная, как блок не изменяемых данных, то добавляем const, сообщая компилятору что это константа. То есть квалификатор const не для программиста предназначен, а для компилятора. Тогда при компиляции программы, компилятор так собирает программу с учетом const что она становиться, как бы, более оптимизированной. Можно по-автомату везде по добавлять const во всех переменных если они не изменяются. И ещё const пишем для защиты данных на которые может ссылаться указатель в параметрах функции, что бы код в функции не смог внести изменения в аргумент который ей передается. Хотя не понять, если мне надо написать функцию что бы она не изменяла значение аргумента - то конечно напишу такую функцию, и мне не надо уточнять параметр функции квалификатором const, потому что она и так не будет изменять аргумент. Либо const это ещё от защиты от не внимательности программиста?
Да, собственно вопрос о volatile. Согласно книге Шилдта "Квалификатор volatile сообщает компилятору, что значение переменной может изменятся не явно" Далее какое то не понятное объяснение применения квалификатора volatile. Как это, "значение переменной может изменятся не явно"? Её что духи могут изменять которые в оперативной памяти находятся? (шутка) Если есть переменная то должно быть её значение, то есть должно быть использование оператора "=" присваивания и ей должно присваиваться значение, как правильно сказать явно. Просьба помочь с пониманием этих штук в С void и volatile. Это наверное самое не понятное что есть в С. Эти штуки как то связаны с компилятором языка, и может быть можно сильно не вникать в их суть. Далее в книге ещё идет объяснение спецификаторов хранения: extern, static, register, auto. Это тоже как то не понятно. А с остальным мне кажется можно разобраться, с указателями и массивами в С.
Спасибо.
void manual_function() {
printf("Response from manual function\n");
}manual_function() {
printf("Response from manual function\n");
}void unsigned i;
Решение задачи: «Что такое void и volatile?»
textual
Листинг программы
#include <Windows.h>
bool g_fStopThread = false;
DWORD _stdcall ThreadProc(PVOID Param)
{
while (!g_fStopThread) {}
return 0;
}
int main()
{
HANDLE const hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
Sleep(1000);
g_fStopThread = true;
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Объявляется булева переменная
g_fStopThreadтипаboolсо значениемfalse. - Создается функция
ThreadProcс использованием директивыDWORD _stdcall, которая принимает параметрPVOID Paramи возвращаетDWORD. - В функции
ThreadProcсоздается бесконечный цикл, который выполняется до тех пор, пока значение переменнойg_fStopThreadне станетtrue. - В функции
mainсоздается объект типаHANDLEс именемhThread, который представляет собой поток, созданный функциейCreateThread. - В функции
mainвызывается функцияSleepс аргументом1000, чтобы задержать выполнение программы на 1 секунду. - Значение переменной
g_fStopThreadизменяется наtrueв функцииmain. - В функции
mainвызывается функцияWaitForSingleObjectс аргументамиhThreadиINFINITE, чтобы дождаться завершения потока. - В функции
mainвызывается функцияCloseHandleс аргументомhThread, чтобы закрыть поток. - Функция
mainвозвращает значениеEXIT_SUCCESS.