Jak wprowadzić nowoczesny C++23

0

Mam pytanie jak pozbyć się #define FMT_HEADER_ONLY #include "fmt/format.h" żeby korzystać z funkcji print i println? Obecnie muszę doinstalować libfmt-dev, lecz println nadal nie działa.
Czy muszę czekać na GCC 13 i wtedy oczyszczę swój kod z tych dwóch dyrektyw? Jest jeszcze #include <format>, fmt::format("{0}{1}{0}", "jakis", "tekst"); ale to trzeba kolejną osobną bibliotekę doinstalować.
https://github.com/fmtlib/fmt

#include <iostream>
 
#define FMT_HEADER_ONLY
#include "fmt/format.h"
 
using fmt::print;
 
int main()
{
    auto num {1024};
    auto name {"C++ 23"};
 
    print("Number is {}\n", num);
    print("Name is {}\n", name);
}
1

A co fmt ma do C++23?
W C++20 wprowadzono std::format, który jest motywawany biblioteką fmt.
W C++23 dodano do std inne funkcjonalności fmt np std::print.

FMT_HEADER_ONLY - ma zastosowanie tylko do zewwnętrzenej biblioteki i działa w dowolnym standardzie C++ wspieranym prze ta bibliotekę (AFAIK C++11).

https://godbolt.org/z/7333fT8zx - zwóć uwagę na wybrany kompilator i flagi w tym C++11

Ergo coś pomieszałeś i sam sobie życie utrudniasz.

0

Niby się zgadza ale println nie działa, dlatego pytam czy muszę czekać na nowszą wersję GCC. Korzystam z opcji -std=gnu++23 -lfmt. Także std::format też mi nie działa bez dyrektywy #include "fmt/format.h". Pobrałem też ten nowoczesny kompilator Circle i na nim też się nie kompiluje.
https://www.circle-lang.org/

#include <iostream>
#include <print>

// using fmt::format;
// using fmt::print;

int main()
{
    const char* str {"Hello, World!"};
    std::print("The str is {}\n", str);

    std::println("Please");
    std::println("enter");
 
    std::print("pass");
    std::print("word");
 
    std::println(""); // same effec
}

Wyskakuje błąd: fatal error: print: Nie ma takiego pliku ani katalogu 2 | #include <print> | ^~~~~~~ compilation terminated.

Już mam odpowiedź.
Na dzień dzisiejszy (15 listopada 2022 r.) GCC 12.2 nie obsługuje tej funkcji. A raczej jego standardowa implementacja biblioteki go nie obsługuje (ponieważ jest to funkcja biblioteki, a nie kompilatora). UWAGA: Funkcja jest wymieniona jako zaimplementowana w GCC 13.0 ( link ) możesz wypróbować Clang 14.0.0 i nowsze

https://stackoverflow.com/questions/63724059/does-gcc-support-c20-stdformat

0

na godbolt jest clang 16 i tam też nie działa #include <print> println(...)

ciekawe że w Pascal odpowiednik println czyli writeln() był od zarania dziejów :)

0

Musisz poczekać aż kompilatory staną się kompatybilne.

A w praktyce zaniechałbym nauki c++23, bo patrząc po ofertach pracy nadal w 2023 roku jest problem z wdrażaniem c++17. W wielu miejscach pracy go nie ma. My to zrobiliśmy dopiero parę miesięcy temu, bo dziadki z jednego zespołu blokowały.
Idąc takim tempem ja bym polecał poczekać do 2030, bo wtedy powoli standard c23 będzie się stawał powszechny.

0

@croatoan a możesz napisać dlaczego potrzebujesz c++23 ? Czego Ci brakuje ?

0

Problemem jest zapewne niechęć do stosowania zewnętrznych bibliotek, bo w C++ jest to upierdliwe. Jest o wiele przyjemniej jak cośjest dostępne w standardzie.
Jeśli to jest powodem to polecam zainteresować się Conan.

croatoan napisał(a):

Niby się zgadza ale println nie działa, dlatego pytam czy muszę czekać na nowszą wersję GCC. Korzystam z opcji -std=gnu++23 -lfmt. Także std::format też mi nie działa bez dyrektywy #include "fmt/format.h". Pobrałem też ten nowoczesny kompilator Circle i na nim też się nie kompiluje.
https://www.circle-lang.org/

Nadal mieszasz dwie rzeczy. Standardową bibliotekę i bibliotekę third party!
-lfmt nie ma wpływu na rzeczy z std::. Zgodnie ze standardem C++ nie wolno modyfikować namespace std poza wyraźnie udokumentowanymi wyjątkami.
Masz u siebie jakiś bałagan i tak naprawdę nie wiesz jakie są skutki twoich działań. Im więcej piszesz tym bardziej wygląda to na Problem XY.

0
MarekR22 napisał(a):

Problemem jest zapewne niechęć do stosowania zewnętrznych bibliotek, bo w C++ jest to upierdliwe. Jest o wiele przyjemniej jak coś jest dostępne w standardzie.
Jeśli to jest powodem to polecam zainteresować się Conan.

Jest Conan a w cmake jest FetchContent , można sobie ogarnąć per projekt dowolna bibliotekę w dowolnej wersji , na ta chwilę to ja nie wie o co tak do konca chodzi dla OP , czy che używać <fmt...> czy che uzywac <print> , pewne jest ze nie warto gonic za cyferkami w wersji kompilatora tylko uzywac to co działa

0
croatoan napisał(a):

Zainstalowałem libperl-dev ale to nie pomaga, nadal muszę używać #define FMT_HEADER_ONLY

https://stackoverflow.com/questions/16710047/usr-bin-ld-cannot-find-lnameofthelibrary
https://stackoverflow.com/questions/73156022/c-fmt-library-undefined-reference

Chyba pomyliłeś nazwę paczki.
Po czymś takim wszystko mi działa

$ sudo apt-get install libfmt-dev
$ cat foo.cpp
#include <fmt/ostream.h>
#include <fmt/format.h>

using fmt::print;

int main()
{
    auto num {1024};
    auto name {"C++ 23"};

    print("Number is {}\n", num);
    print("Name is {}\n", name);
}

$ g++ foo.cpp -l fmt
$ ./a.out
Number is 1024
Name is C++ 23

namieszałeś też z include.

0

Nareszcie działa i z tym kodem #include od @MarekR22 i flagą w kompilatorze którą podał @Marius.Maximus. Wielki dzięki panowie, tak to skompilowałem jak poniżej. Z tymi flagami kompilatora kompiluje się nawet z samym #include "fmt/format.h" nie trzeba nic innego dodawać. W przyszłości będę korzystał z std::print.
"cpp": "cd $dir && g++ -std=c++23 -O2 -fsanitize=address -Wall -Wextra -Werror -lfmt $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",

#include "fmt/format.h"
 
using fmt::print;
 
int main()
{
    auto answer { "przygodo!" };
    print("Ahoj, {}\n", answer);
}

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