09 août 2025

Qt Search Engine

The Qt search engine

See also: Qt Home , Doc , Source (qt6 est une des branches du repo qt5)
Parcourir interactivement le code de Qt5 et Qt6 

Pour chercher 'QThread' uniquement dans github, utiliser 'QThread  site:github.com'
Pour exclure la doc officielle de Qt des résultats, utiliser 'QThread  -site:doc.qt.io'

--- Ajouter ce search engine à Firefox ---

 

26 avril 2025

__cplusplus_xxxxxx 202401


Ce qui suit est sous Windows avec MinGW64, mais c'est la même logique sous Linux

Le but est de savoir quelles versions de C++ une version de gcc supporte et, pour une version de gcc donnée, quels sont les aspects de la norme qui sont effectivement supportés.

 

1/ Comparons la sortie de deux versions de gcc :

==== MinGW13  ========================================================

$ gcc.exe --version
gcc.exe (x86_64-posix-seh-rev1, Built by MinGW-Builds project) 13.1.0

$ gcc.exe -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L


Par défaut gcc 13 se conforme à c++17.

$ gcc.exe -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202100L

on peut lui demander explicitement c++20 et c++23

$ gcc.exe -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
gcc.exe: error: unrecognized command-line option '-std=c++26'; did you mean '-std=c++20'?

mais pas le futur standard c++26.

==== MinGW14 =========================================================

$ gcc --version
gcc.exe (x86_64-posix-seh-rev2, Built by MinGW-Builds project) 14.2.0

$ gcc -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L


Par défaut gcc 14, comme gcc 13, se conforme à c++17.

$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202302L

Il supporte aussi c++20 et c++23

$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202400L

et supporte partiellement c++26 avec la macro __cplusplus définit à '202400' !!

 

2/ Pour savoir quels aspects du langage c++ sont supportés par gcc il faut lui demander de lister tous les #define _cpp_xxxx qu'il génère. En les triant par ordre chronologique il est alors facile de voir les nouveautés:


$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_constexpr 202211L
#define __cpp_multidimensional_subscript 202211L


$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_multidimensional_subscript 202211L
#define __cpp_constexpr 202306L
#define __cpp_placeholder_variables 202306L
#define __cpp_static_assert 202306L

Avec ces commandes vous savez la version par défaut supportée par gcc, et vous savez le degré d’adhésion aux différents aspects du langage.

Pour savoir ce qui vous attend vous pouvez suivre au jour le jour le développement de gcc ici 

26 mars 2025

Cours / Conferences C++

Liste de chaînes YouTube dédiées à C++


28 décembre 2024

isPrime(n) avec une regex

Ce minuscule script Perl d'une seule instruction ( print str =~ regex ? no : yes ) indique par YES ou NO si le l'entier passé en argument sur la ligne de commande est un nombre premier :

#!/usr/bin/perl
#usage: isPrime.pl <entier>
print (('@' x $ARGV[0]) =~ /^.?$|^(..+?)\1+$/ ? "NO\n" : "YES\n");

Spirale d'Ulam

Le cœur du script est une expression régulière qui matche quand l'argument n'est pas un nombre premier. Cette expression régulière s'applique à une chaîne de caractères identiques et de longueur égale à la valeur de l'argument. 

La chaîne contenant autant de @ qu'indiqué par l'argument est construite avec  ('@' x $ARGV[0]).

Exemple: isPrime.pl 6  travaille sur la chaîne "@@@@@@"

La première partie de la regex ^.?$ détermine s'il y a 0 ou 1 caractère dans la chaîne, autrement dit si le nombre à tester est 0 ou 1. Si c'est le cas le nombre n'est pas premier (affiche NO).

La deuxième partie de la regex ^(..+?)\1+$ détermine s'il est possible de décomposer la chaîne en la répétition d'une sous chaîne d'au moins 2 caractères. Si c'est le cas c'est que la longueur de la chaîne (donc la valeur de l'argument) peut s’écrire L * N, (avec L>0 et N>1) et donc le nombre n'est pas premier (affiche NO).

  • L est la longueur de (..+?)
  • n est le valeur que représente le + dans \1+

Exemples :

  • isPrime.pl 9
    La chaîne de 9 caractères "@@@@@@@@@" est décomposée en 3 répétitions de "@@@"
    ==> matche ==> 9 n'est pas un nombre premier.

  • isPrime.pl 12
    La chaîne de 12 caractères "@@@@@@@@@@@@" est décomposée en 6 répétitions de "@@"
    ==> matche ==> 12 n'est pas un nombre premier.

  • isPrime.pl 11
    La chaîne de 11 caractères "@@@@@@@@@@@" n'est pas décomposable en N répétitions d'une chaîne de longueur L
    ==> ne matche ==> 11 est un nombre premier.

La classique boucle de cherche les diviseurs d'un nombre est prise en charge par la recherche itérative d'une solution dans le moteur d'expressions régulières. Bien sur la méthode n'est ni efficace en place mémoire ni en temps de calcul, mais elle est originale.

Vous trouverez une liste des 50000 premiers nombres premiers ici.

Note: L'image utilisée pour illustrer ce post est la spirale d'Ulam qui représente la position des nombres premiers sur une spirale. Les lignes droites semblent indiquer une certaine organisation (un pattern) des nombres premiers...intriguant...