2014-07-05 4 views
0

Est-ce que le inline __attribute__((__always_inline__)) de gcc génère un avertissement lorsque le compilateur ne peut pas fonctionner en ligne?gcc avertissement "non aligné"

Parce que VS ne http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx:

If the compiler cannot inline a function declared with __forceinline, 
it generates a level 1 warning. 
+2

Vous avez besoin de '-Winline' –

+0

J'ai ajouté ce drapeau - mais rien ne se passe. Il avertit seulement quand il ne peut pas en ligne? Puis-je lire quelque part à ce sujet? – tower120

+0

Vous pouvez le tester en prenant l'adresse de la fonction pour l'empêcher d'être inline et ensuite vous devriez voir un avertissement, –

Répondre

2

Vous devez -Winline pour obtenir des avertissements sur les fonctions non inline.

Si vous voulez vérifier cela, vous pouvez essayer de prendre l'adresse d'une fonction inline (ce qui l'empêche d'être inline) et vous devriez voir un avertissement.

#include <stdio.h> 

static inline __attribute__ ((always_inline)) int add(int a, int b) 
{ 
    return a + b; 
} 

int main(void) 
{ 
    printf("%d\n", add(21, 21)); 
    printf("%p\n", add); 
    return 0; 
} 

EDIT

J'ai essayé de produire un avertissement avec le code ci-dessus et d'autres exemples sans succès - il semble que le comportement des versions actuelles de gcc et clang peut avoir changé dans ce région. Je vais supprimer cette réponse si je ne peux pas coder avec un meilleur exemple qui génère un avertissement.

+0

Plus de détails pourraient être nécessaires. Je ne peux pas produire l'avertissement en suivant ces instructions. Tenter de recurse produit un avertissement, mais cela ne dépend pas de passer '-Winline'. – Potatoswatter

+0

Ici, exemple de travail http://coliru.stacked-crooked.com/a/d83ed9ae369590ce. Vous pouvez recevoir un avertissement avec always_inline, uniquement si vous utilisez des fonctions virtuelles, ou d'autres appels indirects (qui ne peuvent pas être déduits en appel normal). D'un autre côté, le simple 'inline' est simplement un indice du compilateur. – tower120

+0

Cool - Je pense qu'il était beaucoup plus facile d'obtenir cet avertissement avec des versions plus anciennes de gcc, même pour le code C. N'hésitez pas à modifier votre code dans ma réponse si vous le souhaitez. –

Questions connexes