cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить функциям имя возвращаемого значения #594

Open perfectGenius opened 1 month ago

perfectGenius commented 1 month ago

Язык позволяет давать имена параметрам, передаваемым функции, отчего достаточно в IDE навести курсор на функцию и увидеть их. Но, чтобы узнать что она возвращает, надо лезть в код функции или читать документацию. Но ведь было бы значительно удобнее узнавать таким же способом - наведением курсора в IDE. Варианты, где можно расположить имя возвращаемого:

int [код_ошибки] прочитать_файл_в_память(UINT начало, UINT конец) или return [код_ошибки] ФАЙЛ_ПУСТОЙ

tomilov commented 1 month ago

int /* sum */ sum(int a, int b) типа того что ли? Кажется существующих языковых выразительных средств уже достаточно. IDE умеют вытаскивать doxygen комментарии во всплывающие подсказки.

perfectGenius commented 1 month ago

int /* sum */ sum(int a, int b)

Проверил в VS2022, не показывает.

doxygen

Кроме языка надо ещё учить целую отдельную систему, просто отлично. И даже с существованием таких средств Visual Studio почему-то мне не показывает, что printf() возвращает количество напечатанного. Т.е. есть какая-то причина, почему они не стали стандартом. Всё это выглядит костылями, хотя имя возвращаемого для меня кажется фундаментальной частью языков наравне с именами параметров.

vtopunov commented 1 month ago

Имя функции описывает имя возвращаемого значения. Если это не так, то возвращаемое значение - не самое главное в функции и читайте что-то за пределами кода

kov-serg commented 1 month ago

Если вам нужна гибкость и информативность используйте структуры для описания сложных, настраиваемых функций или функций с контекстами:

struct adc {
    unsigned a,b,c; // input
    unsigned r,f;   // output
    adc& run() {    // body
        r=a+b+(c&1); f=0;
        unsigned s=~(~((unsigned)0)>>1);
        if (r<a || r<b) f|=1;
        if ((a&s)==(b&s) && ((a&s)!=(r&s))) f|=2;
        return *this;
    }
    unsigned result() const { return r; }
    bool unsigned_overflow() const { return f&1; }
    bool signed_overflow() const { return f&2; }
};

#include <stdio.h>
int main(int argc, char const *argv[]) {
    unsigned smax=~((unsigned)0)>>1;
    printf("0x%08X\n",adc{smax,1,1}.run().result());
}