Calcul de la longueur d'une chaîne C au moment de la compilation
En C , il est possible d'effectuer des calculs sur des littéraux de chaîne lors de la compilation. Considérez l'extrait de code suivant :
<code class="c++">#include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); }</code>
Ce code utilise une fonction récursive pour déterminer la longueur d'une chaîne littérale donnée au moment de la compilation. En imprimant les résultats, nous pouvons confirmer que la fonction calcule correctement les longueurs de chaîne, c'est-à-dire 4 et 8. Le code assembleur résultant démontre également que ces calculs sont effectués lors de la compilation.
Cependant, la question critique demeure : l'évaluation de cette fonction de longueur est-elle garantie au moment de la compilation selon la norme C ?
La réponse n'est pas aussi simple qu'on pourrait le supposer. Selon le projet de norme C (section 5.19), les expressions constantes « peuvent être évaluées lors de la traduction ». Cependant, il ne s'agit que d'une note non normative, et non d'une garantie inébranlable.
Pour garantir une évaluation au moment de la compilation, nous pouvons utiliser deux stratégies :
Par conséquent, bien que la norme n'exige pas explicitement que la fonction de longueur soit évaluée au moment de la compilation, nous pouvons appliquer une telle évaluation en l'utilisant comme expression constante ou en initialisant une variable constexpr. Cette pratique ouvre la possibilité d'effectuer des calculs sophistiqués sur des littéraux de chaîne lors de la compilation, tels que le calcul de hachages ou l'exécution de manipulations de chaînes complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!