Tout d'abord, j'ai un fichier d'en-tête pour une classe, une déclaration de spécialisation sans définition (échantillons de code à partir d'Internet)Ma spécialisation de modèle diffère de la version de débogage de la version finale, est ce bug gcc?
$ cat foo.h
template<typename T>
class foo{
public:
static void init(){
return;
}
};
template<> void foo<int>::init();
Ensuite, il sommes 2 de mise en œuvre fichiers de spécialisation du modèle
$ cat foo_int.cpp
#include "foo.h"
#include<stdio.h>
template<>
void foo<int>::init(){
printf("init int foo\n");
}
$ cat foo_float.cpp
#include "foo.h"
#include<stdio.h>
template<>
void foo<float>::init(){
printf("init float foo\n");
}
Enfin je suis arrivé un fichier principal
$ cat main.cpp
#include "foo.h"
int main(){
foo<int>::init();
foo<float>::init();
}
Si je compile sans l'optimisation et l'exécuter, il donne:
g ++ foo_int.cpp foo_float.cpp main.cpp & & a.out
initialisation int foo
flotteur initialisation foo
Si j'ajoute l'optimisation, le résultat est différent:
$ g ++ foo_int.cpp foo_f loat.cpp main.cpp -O2 & & a.out
initialisation int foo
Le résultat est différent. Quelques explications sur internet a dit cela est dû à un mécanisme interne de « symbole faible » dans la mise en œuvre gcc, mais ma question:
Est « faible symbole »/« symbole fort » un concept de gcc/g ++ ou fait partie de la spécification du langage c/C++. Si les résultats du débogage et de la sortie sont différents, devrais-je dire qu'il s'agit d'un bug/problème de gcc/g ++, en ce qui concerne le mécanisme du "symbole faible"? En tant que développeur, je ne m'attendrais pas à ce que ma version de débogage se comporte différemment de la version finale.
J'ai essayé clang, malheureusement même erreur. Est-ce un cas "acceptable" pour C/C++ que debug/release "devrait" se comporter si différemment?
Déclaration de spécialisation de 'void foo :: init()' n'est pas visible dans 'main' ... Votre programme est mal formé. –
Jarod42
Faites attention lorsque vous formatez le texte. Seuls les blocs de code conservent les espaces blancs et les sauts de ligne. Lorsque vous avez collé la sortie de la console 'g ++' sous le balisage '>', les sauts de ligne ont tous été écrasés dans une ligne de texte. Pour préserver les sauts de ligne, placez un double espace à la fin de chaque ligne. Ou simplement coller est comme un bloc de code. Les lecteurs n'ont généralement aucun problème à remarquer lequel contient du code et lequel contient du vidage de console :) – quetzalcoatl
"J'ai un fichier d'en-tête pour une classe" - non, vous avez un fichier d'en-tête pour un ** modèle ** . –