Препроцессор что это. Директива
HTML-код
- Опубликовано: 15 дек 2024
- Понравилось видео или оказалось полезным? Подпишись!
Препроцессор что это. Директива #define. Макросы. Директивы препроцессора что это. C ++ Урок #66
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
Я просто скачал видео( т.к. не имею доступа к безлимитному интернету в 21 веке) и решил отлайкать все с первого урока. Не устану говорить спасибо! Добавьте пожалуйста номер счёта. есть люди, которые желают отблагодарить вас материально
Пожалуйста! Благодарю за поддержку! Ссылка для тех кто желает отблагодарить материально www.donationalerts.ru/r/simplecode
Поддерживаю, у Сергея есть курс на Udemy. Я уже купил. Еще бы руку пожать! :)
@@alexxxusxxi Я случайно зашел на этот канал. Почему то мне не показывает Ютуб в рекомендуемые....
@@alexxxusxxi Можешь, пожалуйста, дать ссылку на udemy Сергея?
include знал,а вот define щас понял как работает,удобно,Спасибо Сергей!!!
После этого урока, перевел все директивы на эмодзи символы :D
Define - макрос, конечно, очень удобная и полезная штука, но из практики могу только сказать - злоупотреблять не стоит. Особенно с переписыванием синтаксиса языка. Проходит немного времени, ты забываешь те мысли, которые ты туда вкладывал, и код становится откровенно корявым и нечитабельным, только из-за того что это уже не стандартный язык программирования.
Самое оптимальное применение, к примеру в Ардуино, назначение названий портов, цвета лампочек, различные константы и т.д и т.п, и прочие технические штуки, но желательно минимум вмешательства в стандарт синтаксиса языка.
Вы пишете: *желательно минимум вмешательства в стандарт синтаксиса языка* Вмешательство в стандарт синтаксиса языка - это UB
#препроцессор #define #SimpleCode #урокипрограммирования
*Написал 1C на C++*
#include
#define процедура int main
#define установить_язык setlocale
#define ру "ru"
#define ЛОКАЛИЗОВАТЬ_ВСЕ LC_ALL
#define использовать_пространство_имен using namespace
#define вернуть return
#define вывести cout
#define новстроч endl
использовать_пространство_имен std;
процедура()
{
установить_язык(ЛОКАЛИЗОВАТЬ_ВСЕ,ру);
вывести
Ты в конце фигурную скобку забыл)
Интересно, но тупо и бесполезно. Проще изначальными методами и понятней.
@@artsam7617 ну не понятней). Зато у меня программа долго загружается и англ программистам не понятно будет).
а Вы не из 1С программистов?
Жжешь) интересно а часто встречаемые части кода можно так сокращать, было бы удобно, возможно)
Очередной лайк!!! Не перестаю восхищаться умением автора донести информацию в сжатом и в то же время доступном формате!!!!
Как же хорошо можно преподавать язык Си! Настолько привыкаешь к вашему голосу и спокойной подаче информации - что включаешь даже фоном для успокоения)
удивительно то, как define облегчает жизнь при работе с большими проектами, спасибо за *ОТЛИЧНОЕ* объяснение
Спасибо большое за урок! На паре не смог понять это, но у вас всё ясно!
Спасибо большое. Вы все правильно описали. Гайвер в своих прогах все в девайнах захреначил.... Я даже в ступор сначала ушел.......
Спасибо за краткость и ясность!
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
Хотел понять что такое define, теперь стало ясно, спасибо!
Спасибо большое за качественные уроки. Актуально и по сей день!
Посмотрел видео и понравилось как преподносит информацию . лайкну и буду смотреть дальше.
Блин, все супер! Чего так мало просмотров? Уроки заслуживают больше!
Благодарю, за поддержку! Исправить ситуацию очень просто, если все кому нравятся мои уроки сделают по репосту или жмакнут лайк=)
Потому что многие считают программирование(вообще науку) не искусством, искусством математики физики итд тип , а занудство. .
@@loner7222 +
Не у всех хватает терпения и настойчивости(
Кто-то понимает, что программирование - это не его, а кому-то только предстоит узнать)
@@mar_kha ,часто лень и отсутствие дисциплины, перечеркивает обучение на корню. Даже если у человека есть хорошие задатки к обучаемости.
Храни вас Бог!!!! я уже свихивалась потихоньку. Вы так всё прекрасно объясняете
Очередное спасибо за урок.
Ваш видое уроки всегда мне будет полезно, именно нам студентам ! Вам большое спасибо! Продолжаете дальше и развиваете👍✊
Гайд о том , как создать Йопта скрипт
ахахах, тоже об этом подумал!
Точнее Йопта++
Лол, а что это
хахаха, сделал
Спасибо, Сергей, за столь хорошую информацию
Спасибо! Отблагодарил вас небольшим бонусом).
Прикрепите лучше ссылку в описание к видео - "Для тех кто желает отблагодарить материально www.donationalerts.ru/r/simplecode "
благодарствую.
Спасибо
Чтобы не было проблем, как с begin, лучше всегда писать простанство имён std, так будет std::begin() и begin как скобочка))
Спасибо)
Да уж, было интересно. Об этом обычно рассказывают как основы в начале, но это больше похоже на фишку которую можно использоваться уже после того как ты знаешь хоть что-то. Не удивительно что многи люди просто забывают об этом
Спасибо за знания !
Благо дарю за урок)
спасибо!
Спасибо!)
Пожалуйста!
Сергей, а правильно я понимаю. что если include подключает файл, то если написать #include , или еще дополнительно дописать путь к файлу, то он будет брать данные оттуда?
Круто! Интересная тема
Спасибо !
спасибо большое!
Большое спасибо!❤🍪
Спасибо !!
Что же ты раньше молчал о такой прекрасной штуке.Теперь я не буду писать этот cout
Спасибо.
Я так понял, что с помощью define можно такое на куивертить с синтаксисом, что получится в стуктуре всё тот же cpp, но выглядеть он будет как что-то совсем извращенное. Написав такой вот define хэдэр можнл юзать свои кастом плюсы.
Прикольно)
Да) Только так никто обычно не делает. У препроцессора совсем другая задача: адаптация кода программы для сборки различными компиляторами, а так же упрощение использование сложно-замороченного кода конечными юзерами. Например, в тестовых фреймворках наподобие gtest, что бы создать юнит-тест, вы пишете что-то вроде: UNIT_TEST(Sample) { код теста } На самом деле макрос UNIT_TEST разворачивается во что-то очень сложно-замороченное. Но вам, пользователю, об этом думать не нужно. Вы можете просто писать: UNIT_TEST и не заморачиваться.
спасибо
Begin end паскалик любимый точней приевшийся
А в ООП макрос тоже так же функционирует или есть свои нюансы?
spasibo
Спасибо за разъяснения, всё примерно так и думал. Но вот недавно я решил исследовать библиотеки stm32 и у меня мозг просто закипел от этих дефайнов. Там дефайн на дефайне и дефайном погоняет. Один заменяет другой, другой заменяет третий, третий заменяет какую то функцию которая находится в другом хэдере и в котором то же макросы макросы макросы!!! бл скаа как это читать? как это работает вообще?
даа, ебаные завёрнутые клубки, которые нужно разворачивать, ляпота хавхавха
Если я подключаю библиотеку к программе и использую из нее только одну функцию, остальные подгружаются или нет? Как это влияет на производительность?
Не библиотеку, а заголовок. Конечно подгружаются. Компилятор не телепат. Как по вашему он сможет понять, что именно там есть, и что именно оттуда будет использовано, если не подгрузит содержимое заголовка?
Вы спрашиваете: *Как это влияет на производительность?* Никак.
В main скобки забыл заменить на begin и end!
👍👍👍
Добро пожаловать в 2021 здесь господствует Pascal++
7:06 - это что за комбинация клавиш позволяет так делать??
Выделите фрагмент кода, который хотите закоментировать и нажмите Ctrl + K, C (удерживая Ctrl нажать K, затем C). Для снятия комментариев нужно выделить закомментированный кусок и нажать Ctrl + K, U.
так же есть такое ценное ОЧЕНЬ даже ценное умение для программиста как УМЕНИЕ ГУГЛИТЬ
если не умеешь гуглить учись если не хочешь учится то изучать программирование нет смысла
@@lacklacktriplehack4174 Гуглить я умею. Нашёл уже давно информацию. Написал комментарий для других, кто тоже интересуется этим вопросом. Наткнутся на мой коммент и увидят твой ответ
@@SAD-oe9lw ну просто ниже уже дали ответ
Ну точно паскаль(begin и end);
С begin и end - вообще проблем не будет, если не использовать: "using namespace std;" даже создатель крестов об этом говорил, что не очень хорошо использовать это.
а если у меня константа inline, которая тоже при компиляции подставляется в коде, то в чём тогда отличие? Кроме того, что компилятор может игнорировать inline
Канал невероятно крутой, кто-нибудь может поделиться подобным же каналом по Пайтону или Джава. Можно и платные курсы. Можно и на немецком языке.
Такой канал болше нету
Спасибо, есть вопрос, как вы так быстро комментируете код ? Подскажите пожалуйста.
Ctrl+K, Ctrl+C, чтобы раскомментировать - Ctrl K, Ctrl+U
Если мы не будем использовать "using namespace std" , а прописывать "std::begin", то мы ведь не столкнёмся с этой проблемой? Вообще многие не рекомендую использовать "using namespace std"
почему
@@МихаилПолшков-х8м Проф. программисты действительно предпочитают явно указывать пространство имен по ряду причин: 1 - улучшает читабельность кода. 2- защита от коллизий имен.
Константа, которая является макроопределением
Захотелось написать крестики нолики и даже получилось. Сначала сделал уродскую через goto и тд. Потом довел до такого варианта:
#include
#include
#include
using namespace std;
int main();
void win()
{
string a;
cout a;
main();
}
void lose()
{
string a;
cout a;
main();
}
void draw(char arr[][3])
{
system("cls");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout > pos2;
pos1 -= 1;
pos2 -= 1;
while ((pos1 < 0 || pos2 < 0 || pos1 > 3 || pos2 > 3) || (arr[pos1][pos2] == 'x') || (arr[pos1][pos2] == '0'|| (arr[pos1][pos2] == ' ')))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = 'x';
}
void pc(char arr[][3])
{
int pos1 = 1, pos2 = 1;
while (arr[pos1][pos2] != '*')
{
pos1 = rand() % 3 + 1;
pos2 = rand() % 3 + 1;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void check(char arr[][3])
{
if (arr[0][0] == 'x' && arr[1][0] == 'x' && arr[2][0] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[0][0] == 'x' && arr[0][1] == 'x' && arr[0][2] == 'x') //
{
// * * *
win(); //
} //
//
if (arr[0][2] == 'x' && arr[1][2] == 'x' && arr[2][2] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[2][1] == 'x' && arr[2][2] == 'x') //
{
//
win(); //
} // * * *
if (arr[0][1] == 'x' && arr[1][1] == 'x' && arr[2][1] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[1][0] == 'x' && arr[1][1] == 'x' && arr[1][2] == 'x') //
{
//
win(); // * * *
} //
//
if (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[1][1] == 'x' && arr[0][2] == 'x') //
{
// *
win(); // *
} // *
if (arr[0][0] == '0' && arr[1][0] == '0' && arr[2][0] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[0][0] == '0' && arr[0][1] == '0' && arr[0][2] == '0') //
{
// * * *
lose(); //
} //
//
if (arr[0][2] == '0' && arr[1][2] == '0' && arr[2][2] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[2][1] == '0' && arr[2][2] == '0') //
{
//
lose(); //
} // * * *
if (arr[0][1] == '0' && arr[1][1] == '0' && arr[2][1] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[1][0] == '0' && arr[1][1] == '0' && arr[1][2] == '0') //
{
//
lose(); // * * *
} //
//
if (arr[0][0] == '0' && arr[1][1] == '0' && arr[2][2] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[1][1] == '0' && arr[0][2] == '0') //
{
// *
lose(); // *
} // *
}
int main()
{
cout
#include
#include
#include
using namespace std;
void win()
{
cout 3 || pos2 > 3) ||(arr[pos1][pos2]=='x') || (arr[pos1][pos2] == '0'))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2 ] = 'x';
}
void change2(char arr[][3])
{
int pos1, pos2;
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
while ((pos1 < 0 || pos2 < 0 || pos1 > 3 || pos2 > 3) || (arr[pos1][pos2] == 'x') || (arr[pos1][pos2] == '0'))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void pc(char arr[][3])
{
int pos1=1, pos2=1;
while (arr[pos1][pos2]!='*')
{
pos1 = rand() % 3 + 1;
pos2 = rand() % 3 + 1;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void check(char arr[][3],bool &z)
{
if (arr[0][0] == 'x' && arr[1][0] == 'x' && arr[2][0] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[0][0] == 'x' && arr[0][1] == 'x' && arr[0][2] == 'x') //
{
z = false; // * * *
win(); //
} //
//
if (arr[0][2] == 'x' && arr[1][2] == 'x' && arr[2][2] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[2][1] == 'x' && arr[2][2] == 'x') //
{
z = false; //
win(); //
} // * * *
if (arr[0][1] == 'x' && arr[1][1] == 'x' && arr[2][1] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[1][0] == 'x' && arr[1][1] == 'x' && arr[1][2] == 'x') //
{
z = false; //
win(); // * * *
} //
//
if (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[1][1] == 'x' && arr[0][2] == 'x') //
{
z = false; // *
win(); // *
} // *
if (arr[0][0] == '0' && arr[1][0] == '0' && arr[2][0] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[0][0] == '0' && arr[0][1] == '0' && arr[0][2] == '0') //
{
z = false; // * * *
lose(); //
} //
//
if (arr[0][2] == '0' && arr[1][2] == '0' && arr[2][2] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[2][1] == '0' && arr[2][2] == '0') //
{
z = false; //
lose(); //
} // * * *
if (arr[0][1] == '0' && arr[1][1] == '0' && arr[2][1] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[1][0] == '0' && arr[1][1] == '0' && arr[1][2] == '0') //
{
z = false; //
lose(); // * * *
} //
//
if (arr[0][0] == '0' && arr[1][1] == '0' && arr[2][2] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[1][1] == '0' && arr[0][2] == '0') //
{
z = false; // *
lose(); // *
} // *
}
int main()
{
bool z = true;
string answer;
int players;
setlocale(0, "");
srand(time(NULL));
start:
char arr[3][3]{ {'*','*','*'},{'*','*','*'},{'*','*','*'} };
cout > players;
draw(arr);
change1(arr);
check(arr,z);
draw(arr);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
} else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
cout
Я тестанул, прикольно ;)
@@Ivan-Shyriaiev глупо такой программой хвастаться, но я старался)
@@meyosh8734 круто! единственно еще бы объяснялку по координатам для игрока вначале)
👍👍👍🤘🤘🤘🤘🤘
теперь я могу создать прототип питона на c++
1:40 Вы подключили заголовок. Подключение заголовка так и называется: "подключением заголовка", и не имеет никакого отношения к подключению библиотек.
А почему тут не надо указывать ".h"?
@@sleepyNovember_project По одной из версий, в именах стандартных заголовков отсутствует расширение, что бы подчеркнуть различие между пользовательскими заголовками и стандартными. Пользовательские заголовки - это всегда файлы. А вот стандартные заголовки, строго говоря, файлами быть не обязаны.
@@princessmary5556 благодарю за такое пояснение!
Получается когда уже дело доходит до компиляции то вместо макроса компилятор видит уже сразу значение? а когда переменная то компилятор видит адрес переменно потом идёт по адресу и только после всего этого берёт значение?
Получается так ...
Компилятор не может видеть адрес, так как он выделяется уже скомпилированной переменной.
Почему не пишется знак = ...? PI = 3.14
🧠
up
а если std::begin()? всеравно заменят?
здаров чувк, да, препроцессор пробежится по всему коду и где встретит слово begin заменит абсолютно все на то, что было задано ему в #define
шифровать свой код можно))
Словами не передать как я благодарен автору канала. Благодаря вам у меня есть шанс закончить шарагу.
...
cout
1:06 Вы говорите о подключении файла, но при этом указываете на стандартный заголовок. Здесь вы допускаете грубую ошибку. Согласно правилам языка с++, стандартные заголовки предоставляются реализацией, и формально, вообще не являются файлами.
+
ВАУ!!! ПРОГРАММИРОВАТЬ МОЖНО ПО РУССКИ
#include"pch.h"
#include
#include
#include
#define pi 3.14
#define начало {
#define конец }
#define вывод cout
Кумир в помощь
Ну шо пацаны, погнали свои недоЯПы писать?)
Спасибо
Спасибо!
спасибо
Спасибо
Спасибо