Анонимные параметры в С++

101
20 июня 2021, 06:00

Заметил, что если сделать анонимный параметр, компилятор не будет ругаться на это.

Например

void func(int) { return; }

не вызовет никаких проблем.

Только не нашёл ничего насчёт этого в инете. Может, ищу не так. Зачем это и как такое кушать? Или где можно об этом почитать? Заранее спасибо

Answer 1

Если аргумент не нужен и если компилятор расценивает неиспользуемые переменные как ошибку, то программа не скомпилируется. В этом случае его можно сделать анонимным.

Answer 2

Просто бывает, что такой аргумент не нужен.

Ну, например, какая-нибудь библиотечная функция, которая принимает в качестве параметра функцию от двух переменных. А вам она не нужна - у вас один параметр, второй не нужен. Не используется.

И что делать? можно, конечно, написать функцию от двух аргументов - и не использовать второй. Но тогда компилятор удивится :)

Есть, конечно, и другие пути обхода этого предупреждения, например,

int f(int a, int b)
{
    (void)b;
    return 2*a;
}

или

#pragma warning( push )
#pragma warning( disable : 4100 )
int f(int a, int b)
{
    return 2*a;
}
#pragma warning( pop )

в Visual C++.

Но самое простое - просто указать тип параметра без его имени...

Answer 3

Это один из многих атавизмов из С (или даже из B). В нем реализован крайне вальготный подход к объявлению / определению функций, в т.ч.:

  • объявление функции вообще без параметров и затем указание произвольных аргументов при определении (это в С++ к счатью запретили)
  • несоответствие const квалификаторов аргументов при объявлении и определении
  • несоответствие имен аргументов при объявлении и определении

Даже в самом C нет никаких причин прибегать к подобным трюкачествам, и зачастую все несоответствия подобного рода, в т.ч. опущенные имена аргументов классифицируются как дефект. Также типичной ошибкой является пропуск имени аргумента для подавления предупреждения о неиспользуемом аргументе. Наличие неиспользуемых аргументов также может классифицироваться как дефект, но для явного указания, что аргумент не будет использован предусмотрен стандартный (с С++17) аттрибут [[maybe_unused]]:

void func([[maybe_unused]] int const value) { return; }
READ ALSO
Как освободить порт если он занят

Как освободить порт если он занят

У меня есть программа она занимает порт 4001 если ее не отключать и запустить еще одну программу она будет выдавать ошибку пока порт не закроетсяВопрос,...

92
Ошибка с inline

Ошибка с inline

Подскажите, пожалуйста, с чем может быть связана эта ошибка линковки:

77
constexpr функция вместо define “функции”

constexpr функция вместо define “функции”

ReSharper выдаёт предупреждение "function-like macro used; consider a constexpr template function", что значит: используйте constexpr функцию, вместо defineно при этом ReSharper не говорит...

111
Как передать ByteBuffer в FFmpeg?

Как передать ByteBuffer в FFmpeg?

Я работаю с либой FFmpeg и здесь есть возможность передать путь к mp4 файлу и прочитать егоНо я ищу возможность передать не путь к файлу, а передать...

67