Co wybrać endl czy format?

0

Którą funkcję wykorzystywać przy podawaniu zmiennych std::endl czy std::format, w nowoczesnym programowaniu i w profesjonalnych programach w C++?

std::cout << "Name: " << name << std::endl;
// czy
std::cout << std::format("Name: {}\n", name);
2

Co do pierwszego to std::endl powinno się unikać ogólnie, jeśli nie chcesz robić flush() na strumieniu. Możesz zamiast tego użyć '\n' - efekt będzie podobny, mniej pisania, i będzie szybsze.

Chociaż jak już jest std::format to sam nie wiem czy jest jakaś ogólna zasada kiedy użyć którego.

0

Tak tą różnicę już znam, chodzi mi o te nowe podejście zawodowych programistów C++ do std::format.
„\n” oznacza „umieść nową linię w buforze”
std::flush oznacza „pokaż mi teraz, co jest w buforze”
std::endl oznacza „umieść nową linię w buforze, a następnie pokaż mi, co jest teraz w buforze”

// ta wersja podobno jest najszybsza
std::cout << "Name: \n";
// tu już wymaga dwóch << więc spowalnia ten kod
std::cout << "Name: " << "\n";
// nie wiem czy jest pomiędzy nimi "\n", '\n' jakaś różnica w szybkości?
std::cout << "Name: " << '\n';
// std::endl jest najwolniejszy, można użyć na końcu akapitu (jest to jednak zwyczaj i zwykle nie jest konieczne). 
std::cout << "Name: " << std::endl;


2

Najlepiej to używać biblioteki fmt. To co jest w standardzie C++20 jest nadal kulawe, w C++23 jest lepiej ale nadal wybrakowane.

https://github.com/fmtlib/fmt
https://fmt.dev/latest/index.html

Dla twojego przypadku:
https://godbolt.org/z/85r7zn3Pe

#include <string>
#include <fmt/core.h>

using namespace std::literals;

int main()
{
    auto name = "Boruta"s;
    fmt::print("Name: {}\n", name);

    return 0;
}
0

Jak słucham wypowiedzi wielu zawodowców to odradzają korzystanie z zewnętrznej biblioteki fmt. Na przykład te nowe funkcje i zewnętrzne są podkreślone na czerwono w edytorach vscode, ponieważ tam formatuje kod clangd-16, a on jeszcze ich nie wspiera. Więc wyskakuje taki irytujący komunikat No member named 'format' in namespace 'std'clang(no_member)

2

Jak słucham wypowiedzi wielu zawodowców to odradzają korzystanie z zewnętrznej biblioteki fmt.

To radzę zmineić zaowodowców. Fmt jest znany i używnay w wielu projektach.
co do drugiej części wystarczy wpisać w google i stack


VS Code creates a .vscode folder with a file c_cpp_properties.json.

Changing the line "cppStandard": "c++17", to "cppStandard": "c++20", enables IntelliSense for C++20.


7
romb napisał(a):

Jak słucham wypowiedzi wielu zawodowców to odradzają korzystanie z zewnętrznej biblioteki fmt. Na przykład te nowe funkcje i zewnętrzne są podkreślone na czerwono w edytorach vscode, ponieważ tam formatuje kod clangd-16, a on jeszcze ich nie wspiera. Więc wyskakuje taki irytujący komunikat No member named 'format' in namespace 'std'clang(no_member)

To jest najgorsze możliwe uzasadnienie czemu nie używać zewnętrznych bibliotek.
Ten "zawodowiec" po prostu ma problem z konfiguracją vscode.

Nawet gdybym miał taki problem z konfiguracją IDE. To i tak bym z tego powodu nie odpuszczałbym używania zewnętrznych bibliotek.
Ważniejsze jest, że biblioteka jest szybka, bezpieczna, przyjemna w użyciu i jest w zasadzie standardem, niż to czy IDE ją dobrze koloruje.

1

Tylko fmt::!
Nie warto się zastanawiać nad alternatywami , nic lepszego nie ma i spełnia wszelkie marzenia ;)

0

W praktyce nie ma znaczenia, bo wypisywanie na konsole robisz tylko jak debuggujesz, bo operacje na strumieniach we/wy są mega obciażające, żeby je wrzucać do runtime. Jak potrzebujesz mieć logi to klepiesz osobnego loggera, który Ci zapisuje logi w osobnym miejscu. Natomiast jak debuggujesz to nie ma znaczenia. Ja zawsze używam w takim przypadku std::endl i wyjebongko.

0

@recovery: Gdzie jest to fmt w cpp 20? Żeby móc używać fmt::print trzeba pod Linuksami zainstalować libfmt-dev oraz dodać do CMake

find_package(fmt REQUIRED)
target_link_libraries(Code PRIVATE fmt::fmt)

W C++ nie ma jakiejś wbudowanej funkcji żeby sobie dopisać dowolny println, tak jak w innych językach?

const std = @import("std");
const print = std.debug.print;

pub fn main() void {
    print("Hello, {s}!\n", .{"World"});
}

@MarekR22: Ewentualnie poczekać na GCC 14 i korzystać z std::println

#include <iostream>
#include <format>
#include <print>
using namespace std;



int main()
{
    int answer { 42 };
    auto result = (10 <=> 20) > 0;
    cout << result << endl;
    cout << format("The answer is {}\n", answer);
    
    std::println("Please");
    std::println("enter");
 
    std::print("pass");
    std::print("word");
}
0

@reformat: Do brzegu ! Do brzegu !
Jaki to problem dodać jedna linijkę `target_link_libraries(...'
w c++ masz wolność jaka się filozofom nie śniła

0

Gdzie jest to fmt w cpp 20? Żeby móc używać fmt::print trzeba pod Linuksami zainstalować libfmt-dev oraz dodać do CMake
find_package(fmt REQUIRED)
target_link_libraries(Code PRIVATE fmt::fmt)
W C++ nie ma jakiejś wbudowanej funkcji żeby sobie dopisać dowolny println, tak jak w innych językach?

konkretnie to tu
https://en.cppreference.com/w/cpp/utility/format/format

A ty z kolei mówisz o implementacji standardu. I uwaga uwaga, uznano że bazujący na fmt standard najlepiej zaimplemenotwać używając... fmt. Ale jak mówiłem nie odróżniasz standardu od implementacji.
Jeśli ci się to nie podoba to napisz do odpowiedzialnych.

Z reszta w tym temacie:
a) Napisałem że fmt to standard jak widać twoją prezentacją się nie myliłem...
b) Napisałem użyj fmt....

1 użytkowników online, w tym zalogowanych: 0, gości: 1