(*++argv) [0]
- сместить указатель на следующую ячейку, провести разыменование этой ячейки, взять первый элемент по адресу в этой ячейке.argv
имеет тип const char* const argv[]
. В ячейках argv
лежат элементы типа const char* const
, для которых тоже характерны операторы разыменования и произвольного доступа. ""
. Лично я не вижу проблемы его вывести.std::cout << 'Hello, world'
'Hello, world'
вообще не является ни строковым, ни символьным литералом. Это - значение с типом int
. C2659
говорит о том, что ты пытаешься использовать имя функции как имя переменной. Это, в целом, абсолютно недопустимо.exit
, но объявлена она в пространстве std
, которое ты мог не подумавши раскрыть в глобальное пространство.exit
. Ты вполне мог воспользоваться заголовком, где она описана.::exit
является полной квалификацией имени с расположением в глобальном пространстве. Имя функции с большим приоритетом будет выбрано из глобального пространства.#pragma once
буквально невозможно специфицировать в рамках стандарта и поэтому она не может быть стандартной.AssertEqueal
является неполным. Это шаблон функции, но описания шаблонных параметров нет.ax^2 + bx + c = 0
. Решаем, пишем: x = 42
. И так далее.Assert
- переводится как "Утверждать". Утверждать что-то. Значит, где-то должно быть утверждение. Но у AssertEqueal
этого утверждения нет. Более того, имя функции переводится как "Утверждать равным". Чему равным?TerminateOnDifferent
- выпилиться по разнице значений.Condition
, условие. Правый - это Reference
, норма/эталон.Terminate
однозначно читается в контексте процесса. Прозрачно и то, что по наступлении эквивалентности выхода из этой функции не будет. Следовательно, все, что можно еще сделать, это передать семантику терминации в виде причины. Третий параметр - это Reason
. Вот так, без всяких лишних hint
и Msg
, т.к. аргумент самодокументируется своим типом.template< typename TCondition, typename TReference >
void TerminateOnDifferent( TCondition&& condition, TReference&& reference, const std::string_view reason )
{
if( condition == reference )
{
return;
}
std::cout << "Termination happened due to reason: " << reason << "." << std::endl;
std::terminate();
}
true
вставлена как магическое значение. В другом месте новый параметр будет вычислен. Где-то еще значение будет прочитано из сетевого сокета или файла. T
, u
, в самом AssertEqual
- ничего не отражающих именах. В изломанной структуре кода, в кривом выравнивании блоков. Только hint
отражает свою суть, однако ничего не означает в контексте конструкции утверждений.
Пока я вижу что этот код даже не скомпилируется.