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);
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);
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.
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;
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;
}
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)
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.
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.
Tylko fmt::
!
Nie warto się zastanawiać nad alternatywami , nic lepszego nie ma i spełnia wszelkie marzenia ;)
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.
@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");
}
@reformat: Do brzegu ! Do brzegu !
Jaki to problem dodać jedna linijkę `target_link_libraries(...'
w c++ masz wolność jaka się filozofom nie śniła
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....