25: avertissement: l’élément initializer n’est pas une expression constante

GCC me donne le message d’avertissement suivant lors de la tentative de compilation:

las.c:13:18: warning: initializer element is not a constant expression [enabled by default] const int ROWS = pow (2, MESH_K); 

Les parties de code pertinentes pour cela sont:

  #define MESH_K 10 #define BUFF_SIZE 30 const int ROWS = pow (2, MESH_K); 

Je dois utiliser MESH_K et ROWS ultérieurement dans le code. Je crois comprendre que les appels de fonctions laissent probablement croire que ce n’est pas une expression constante. Cependant, étant donné que cet appel à pow est essentiellement une constante, existe-t-il un meilleur moyen de le mettre en œuvre (des macros de pré-processeur peut-être?) Et d’éliminer l’avertissement?

Cela ne me dérange pas de sacrifier la lisibilité pour la performance dans cette partie du code, donc toutes les solutions complexes sont les bienvenues.

Je crois que votre réponse est ici .

Cela comstackra bien en C ++, mais pas en C.

Cela a à voir avec le langage C. En langage C, les objects à durée de stockage statique doivent être initialisés avec des expressions constantes ou des initialiseurs agrégés contenant des expressions constantes.

Un object “grand” n’est jamais une expression constante en C, même si l’object est déclaré en tant que const.

De plus, en langage C, le terme “constante” fait référence à des constantes littérales (telles que 1, ‘a’, 0xFF, etc.) et à des membres enum. Les objects qualifiés de const (de tout type) ne sont pas des constantes dans la terminologie du langage C. Ils ne peuvent pas être utilisés dans les initialiseurs d’objects à durée de stockage statique, quel que soit leur type.

Comme dit const int ROWS = 1 << MESH_K; , const int ROWS = 1 << MESH_K; fonctionnera, mais:

 int test = 10; const int ROWS = 1 << test; 

Ne fonctionnera pas. Je suppose que MESH_K est collé dans le code en tant que littéral et qu'il est donc résolu en constante C.