Bon, moi j'aimerais déjà pouvoir faire du C23 et malheureusement beaucoup de mes environnements m'en empêche (surtout dans l'embarqué). Ce que j'aime le plus en C23 c'est
initialiser des objets 100% à 0 (y compris les bits de padding) avec struct foo f = {}
spécifier des enum pour avoir un meilleur support des IDEs et une lisibilité du code mais en restant utile pour des structure binaires (e.g. enum type : uint8_t)
Pour la nouvelle norme
Les cases range, bordel je veux ça depuis un bail
le 3367, je comprends pas le nommage stdc_, ça va pas du tout avec l'existant
Le nommage stdc_ est très brièvement justifié dans l'article. Historiquement, seules les quelques premières lettres (8, je crois) d'un nom de symbole étaient significatives. Ce n'était donc pas garanti de pouvoir avoir masuperfonction1 et masuperfonction2 (les deux pourraient voir leur symbole tronqué en "masuperf").
Les versions précédentes du C utilisaient donc des abbréviations de plus en plus obscures (memcpy, strcmp, wmbstocstr, …) pour ne pas avoir de conflits dans ce cas.
La limite ayant été augmentée à 31 caractères, en utiliser 5pour le préfixe stdc_ devient raisonable.
Personellement je suis un peu embêté par le retrait des nombres octals. Je comprend la logique, mais ça ne va pas faciliter la migration de code existant qui en a besoin, ni de pouvoir écrire du code compatible avec plusieurs versions du standard.
Seulement pour les fonction C standard. Et cela se justifie par le fait, qu'elle sont plus simple à mémoriser et plus rapide à écrire. Bon aujourd'hui avec les bons système d'auto-complétion, c'est moins utile. Et surtout avec les ajouts de fonctions, notamment de fonctions plus sécurisé (sans enlever les ancienne pour la rétro-compatibilité), ça devient un peu complexe.
Mais sinon, je trouve très parlant les noms court:
if (int num_fired = fire_off(argc)) {
// checks for num_fired is non-zero
}
Vous pensez que vous allez utiliser ça ? C'est une fonctionnalité dont j'ai souvent eu envie, mais les risques de confusion entre comparaison et assignation me paraissent assez importants.
J'ai souvenir d'une tentative d'introduction de backdoor dans le code de Linux, il y a bien longtemps :
Avec l'apparence d'une comparaison, l'user ID passait à 0, et l'utilisateur devenait root. C'est quand même difficile à détecter, sans doute suffisamment pour en décourager l'usage.
Ton exemple c'est quelqu'un qui essaye volontairement de tromper le relecteur. Les cas accidentels sont souvent détectés par le compilateur. Mais, oui, c'est un danger.
La déclaration me semble moins dangereuse en fait. La déclaration se repère mieux que des parenthèses superflues et force l'affectation (if (int num_fired == fire_off(argv)) { n'a pas de sens). Donc l'affectation devrait être plus repérable par le relecteur.
Je ne vois pas quels risques sont ajoutés, même si ça ne retire pas les risques déjà existants.
Dans certains projets, pour éviter ce problème on utilise les "yoda conditions", ici on aurait écrit:
0 == current_uid
ce qui ne compile pas si on met un = à la place du ==
Mais aujourd'hui les compilateurs savent détecter ce type d'erreur (avec des warnings à activer).
Cette hossibilité de déclarer une variable dans un =f me semble surtout utile en c++ parce que la desruction de la variable sera faite dès la sortie du bloc if/else, cela peut parfois être important. En Ccela servira surtout à alléger l'écriture, ce qui n'est pas forcément une bonne idée (de la même façon que ne pas mettre d'accolades pour un if n'ets pas forcément une bonne idée).
Le blog mentionne des cas d'usages pour des macros, et effectivement c'est dans ce cas que ça peut devenir très intéressant. Imaginons du code comme ceci:
if (ISVALID(X)) { … }
La macro ISVALID() peut avoir besoin de variables temporaires pour faire son travail.
Ça fait des années que j'essaye de l'utiliser en C++ et le résultat est toujours le même, une condition inutilement compliquée qui amène surtout beaucoup de questions. Juste pour réduire la portée d'une variable on se retrouve à se demander pourquoi tout le code est dans le if et quelle est la condition testée au final. Et puis je n'aime pas trop voir des affectations dans les conditions, on se demande toujours si c'est normal, du coup ça gêne le flot de lecture.
S'il faut vraiment limiter la portée d'une variable, ce qui arrive quasiment jamais, je préfère ajouter des accolades :
L'exemple que je donnais avec une macroest très improbable en C++ ouon fera ce genre de chose en enveloppant les choses dans une classe et on aurait dong un if (x.isvalid()) par exemple.
mais en C, il y a un peu plus de cas où ça se justifie (bon, pas vraiment en fait. Faites du C++ au lieu d'insister avec le C)
Oui je le faisais en C++ parce que ça permet d'éviter d'encombrer un bloc plein de variables qui n'ont plus besoin d'être présente après le bloc if. De la même manière qu'on peut déclarer une variable dans une boucle for depuis 1999 :)
if(intrc=gpio_pin_configure(&gpio,GPIO_OUTPUT);rc!=0){LOG_ERR("error: %d",rc);}// rc n'existe plus ici
# J'ai glissé
Posté par pulkomandy (site web personnel, Mastodon) . Évalué à 4 (+1/-0).
Si quelqu'un peut remplacer le w par une apostrophe dans le titre, ça serait super. Mon clavier me joue des tours mais en général il ne se blo
[^] # Re: J'ai glissé
Posté par Benoît Sibaud (site web personnel) . Évalué à 3 (+0/-0).
Parse error. Mais c'est corrigé, merci.
# Oh
Posté par David Demelier (site web personnel) . Évalué à 8 (+6/-0).
Bon, moi j'aimerais déjà pouvoir faire du C23 et malheureusement beaucoup de mes environnements m'en empêche (surtout dans l'embarqué). Ce que j'aime le plus en C23 c'est
struct foo f = {}
enum type : uint8_t
)Pour la nouvelle norme
stdc_
, ça va pas du tout avec l'existantAI is a mental disorder
[^] # Re: Oh
Posté par pulkomandy (site web personnel, Mastodon) . Évalué à 9 (+6/-0).
Le nommage stdc_ est très brièvement justifié dans l'article. Historiquement, seules les quelques premières lettres (8, je crois) d'un nom de symbole étaient significatives. Ce n'était donc pas garanti de pouvoir avoir masuperfonction1 et masuperfonction2 (les deux pourraient voir leur symbole tronqué en "masuperf").
Les versions précédentes du C utilisaient donc des abbréviations de plus en plus obscures (memcpy, strcmp, wmbstocstr, …) pour ne pas avoir de conflits dans ce cas.
La limite ayant été augmentée à 31 caractères, en utiliser 5pour le préfixe stdc_ devient raisonable.
Personellement je suis un peu embêté par le retrait des nombres octals. Je comprend la logique, mais ça ne va pas faciliter la migration de code existant qui en a besoin, ni de pouvoir écrire du code compatible avec plusieurs versions du standard.
[^] # Re: Oh
Posté par abriotde (site web personnel, Mastodon) . Évalué à 2 (+2/-1). Dernière modification le 14 juin 2025 à 21:54.
Seulement pour les fonction C standard. Et cela se justifie par le fait, qu'elle sont plus simple à mémoriser et plus rapide à écrire. Bon aujourd'hui avec les bons système d'auto-complétion, c'est moins utile. Et surtout avec les ajouts de fonctions, notamment de fonctions plus sécurisé (sans enlever les ancienne pour la rétro-compatibilité), ça devient un peu complexe.
Mais sinon, je trouve très parlant les noms court:
strcpy : "string copy"
memcpy : "memory copy"
Le problème c'est quand on en rajoute. strcpy devient ainsi "strncpy" "string copy n characters" (pour la sécu). Et après : https://learn.microsoft.com/fr-fr/cpp/c-runtime-library/reference/strncpy-strncpy-l-wcsncpy-wcsncpy-l-mbsncpy-mbsncpy-l?view=msvc-170 …
On se retrouve avec des versions par type: l pour un long, i pour l'entier, s pour la string. Puis des versions par destination…
Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.
[^] # Re: Oh
Posté par Renault (site web personnel) . Évalué à 6 (+3/-0).
C'était surtout une limitation des compilateurs de l'époque.
[^] # Re: Oh
Posté par Claude SIMON (site web personnel) . Évalué à 4 (+2/-0). Dernière modification le 15 juin 2025 à 07:18.
Plutôt des éditeurs de liens. Les compilateurs ne faisaient que répercuter cette limitation.
« Smart IoT Crafting » : l'IoT pour tous
# Assignation dans les if
Posté par sobriquet . Évalué à 4 (+2/-0).
Vous pensez que vous allez utiliser ça ? C'est une fonctionnalité dont j'ai souvent eu envie, mais les risques de confusion entre comparaison et assignation me paraissent assez importants.
J'ai souvenir d'une tentative d'introduction de backdoor dans le code de Linux, il y a bien longtemps :
Avec l'apparence d'une comparaison, l'user ID passait à 0, et l'utilisateur devenait root. C'est quand même difficile à détecter, sans doute suffisamment pour en décourager l'usage.
[^] # Re: Assignation dans les if
Posté par Clément V . Évalué à 4 (+3/-0).
Ton exemple c'est quelqu'un qui essaye volontairement de tromper le relecteur. Les cas accidentels sont souvent détectés par le compilateur. Mais, oui, c'est un danger.
La déclaration me semble moins dangereuse en fait. La déclaration se repère mieux que des parenthèses superflues et force l'affectation (
if (int num_fired == fire_off(argv)) {
n'a pas de sens). Donc l'affectation devrait être plus repérable par le relecteur.Je ne vois pas quels risques sont ajoutés, même si ça ne retire pas les risques déjà existants.
[^] # Re: Assignation dans les if
Posté par pulkomandy (site web personnel, Mastodon) . Évalué à 7 (+4/-0).
Dans certains projets, pour éviter ce problème on utilise les "yoda conditions", ici on aurait écrit:
0 == current_uid
ce qui ne compile pas si on met un = à la place du ==
Mais aujourd'hui les compilateurs savent détecter ce type d'erreur (avec des warnings à activer).
Cette hossibilité de déclarer une variable dans un =f me semble surtout utile en c++ parce que la desruction de la variable sera faite dès la sortie du bloc if/else, cela peut parfois être important. En Ccela servira surtout à alléger l'écriture, ce qui n'est pas forcément une bonne idée (de la même façon que ne pas mettre d'accolades pour un if n'ets pas forcément une bonne idée).
Le blog mentionne des cas d'usages pour des macros, et effectivement c'est dans ce cas que ça peut devenir très intéressant. Imaginons du code comme ceci:
if (ISVALID(X)) { … }
La macro ISVALID() peut avoir besoin de variables temporaires pour faire son travail.
[^] # Re: Assignation dans les if
Posté par Julien Jorge (site web personnel) . Évalué à 8 (+6/-0).
Ça fait des années que j'essaye de l'utiliser en C++ et le résultat est toujours le même, une condition inutilement compliquée qui amène surtout beaucoup de questions. Juste pour réduire la portée d'une variable on se retrouve à se demander pourquoi tout le code est dans le
if
et quelle est la condition testée au final. Et puis je n'aime pas trop voir des affectations dans les conditions, on se demande toujours si c'est normal, du coup ça gêne le flot de lecture.S'il faut vraiment limiter la portée d'une variable, ce qui arrive quasiment jamais, je préfère ajouter des accolades :
[^] # Re: Assignation dans les if
Posté par pulkomandy (site web personnel, Mastodon) . Évalué à 3 (+0/-0).
L'exemple que je donnais avec une macroest très improbable en C++ ouon fera ce genre de chose en enveloppant les choses dans une classe et on aurait dong un if (x.isvalid()) par exemple.
mais en C, il y a un peu plus de cas où ça se justifie (bon, pas vraiment en fait. Faites du C++ au lieu d'insister avec le C)
[^] # Re: Assignation dans les if
Posté par David Demelier (site web personnel) . Évalué à 3 (+1/-0).
Oui je le faisais en C++ parce que ça permet d'éviter d'encombrer un bloc plein de variables qui n'ont plus besoin d'être présente après le bloc if. De la même manière qu'on peut déclarer une variable dans une boucle for depuis 1999 :)
AI is a mental disorder
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.