IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Spécificateur de type manquant + erreur de syntaxe


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2013
    Messages : 230
    Points : 543
    Points
    543
    Par défaut Spécificateur de type manquant + erreur de syntaxe
    Salut tout le monde,

    Je bosse avec une lib compilée sous VC6, et dont je n'ai pas le code source (et je pense que je ne risque pas de les avoir). J'ai été obligé de faire un include de afxv_w32.h [Ajout] dans le header de la lib [/Ajout] pour résoudre les problèmes de compatibilité de type built in time. Bref il semble que ça m'a fait passer un étape puisque maintenant je n'ai plus de problème de compil avec ma lib mais directement avec afxv_w32.h. J'ai pas mal galéré pour trouver comment résoudre ces erreurs mais honnetement je ne vois pas comment les résoudre, alors je fais appel à votre aide. D'autant plus que certaines erreurs me semblent incompréhensibles, comme le fait que c++ ne prenne pas int par défaut.
    Bref voici la portion de code qui fait défaut, et la stack qui va avec bien sûr.
    Dernière chose, la plupart des problèmes pointent sur AFX_INLINE. J'ai envie de dire : WHY ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    /////////////////////////////////////////////////////////////////////////////
    // Now for the Windows API specific parts
     
    // WM_CTLCOLOR for 16 bit API compatability
    #define WM_CTLCOLOR     0x0019
     
    // Win32 uses macros with parameters for this, which breaks C++ code.
    #ifdef GetWindowTask
    #undef GetWindowTask
    AFX_INLINE HTASK GetWindowTask(HWND hWnd)
    	{ return (HTASK)(DWORD_PTR)::GetWindowThreadProcessId(hWnd, NULL); }
    #endif
     
    // Win32 uses macros with parameters for this, which breaks C++ code.
    #ifdef GetNextWindow
    #undef GetNextWindow
    AFX_INLINE HWND GetNextWindow(HWND hWnd, UINT nDirection)
    	{ return ::GetWindow(hWnd, nDirection); }
    #endif
     
    // Avoid mapping CToolBar::DrawState to DrawState[A/W]
    #ifdef DrawState
    #undef DrawState
    AFX_INLINE BOOL WINAPI DrawState(HDC hdc, HBRUSH hbr, DRAWSTATEPROC lpOutputFunc,
    	LPARAM lData, WPARAM wData, int x, int y, int cx, int cy, UINT fuFlags)
    #ifdef UNICODE
    	{ return ::DrawStateW(hdc, hbr, lpOutputFunc, lData, wData, x, y, cx, cy,
    		fuFlags); }
    #else
    	{ return ::DrawStateA(hdc, hbr, lpOutputFunc, lData, wData, x, y, cx, cy,
    		fuFlags); }
    #endif
    #endif
     
    // Avoid mapping CStatusBar::DrawStatusText to DrawStatusText[A/W]
    #ifdef DrawStatusText
    #undef DrawStatusText
    AFX_INLINE void WINAPI AfxDrawStatusTextA(HDC hDC, LPRECT lprc, LPCTSTR szText,
    	UINT uFlags);
    AFX_INLINE void WINAPI AfxDrawStatusTextW(HDC hDC, LPRECT lprc, LPCTSTR szText,
    	UINT uFlags);
    AFX_INLINE void WINAPI DrawStatusText(HDC hDC, LPRECT lprc, LPCTSTR szText,
    	UINT uFlags) 
    #ifdef UNICODE
    	{ ::AfxDrawStatusTextW(hDC, lprc, szText, uFlags); }
    #else
    	{ ::AfxDrawStatusTextA(hDC, lprc, szText, uFlags); }
    #endif
    #endif
     
    // FreeResource is not required on Win32 platforms
    #undef FreeResource
    AFX_INLINE BOOL WINAPI FreeResource(_In_ HGLOBAL) { return TRUE; }
    // UnlockResource is not required on Win32 platforms
    #undef UnlockResource
    AFX_INLINE int WINAPI UnlockResource(HGLOBAL) { return 0; }

    1> _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'HTASK'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(210): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'HWND'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(210): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(210): error C2086: 'int AFX_INLINE'*: redéfinition
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203)*: voir la déclaration de 'AFX_INLINE'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(217): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'BOOL'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(217): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(217): error C2086: 'int AFX_INLINE'*: redéfinition
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203)*: voir la déclaration de 'AFX_INLINE'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(231): error C2144: erreur de syntaxe*: 'void' doit être précédé de ';'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(231): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(231): error C2086: 'int AFX_INLINE'*: redéfinition
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203)*: voir la déclaration de 'AFX_INLINE'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(233): error C2144: erreur de syntaxe*: 'void' doit être précédé de ';'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(233): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(233): error C2086: 'int AFX_INLINE'*: redéfinition
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203)*: voir la déclaration de 'AFX_INLINE'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(235): error C2144: erreur de syntaxe*: 'void' doit être précédé de ';'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(235): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(235): error C2086: 'int AFX_INLINE'*: redéfinition
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(203)*: voir la déclaration de 'AFX_INLINE'
    1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxv_w32.h(246): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'BOOL'

    PS : j'ai essayé en téléchargeant VC6, et j'ai d'autres erreurs (mais apparemment moins). A moins de devoir migrer sur VC6 absolument (ce que je ne souhaite pas spécialement ) je ne mettrai les erreurs ici.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    La première ligne d'erreur est toujours la plus importante

    Ici, il te dit qu'il ne comprend pas ce que signifient les symboles AFX_INLINE et / ou HTASK (je pencherais plutôt pour AFX_INLINE )

    Au vu du nom, j'aurais tendance à dire que c'est simplement un define sur le mot clé inline, mais il n'est pas impossible qu'il y ait une astuce quelconque à ce niveau

    Il faudrait donc essayer de fouiller dans les fichiers d'en-tête afin de trouver celui dans lequel ce symbole (AFX_INLINE) est déclaré et veiller à l'inclure AVANT l'inclusion de afxv_w32.h

    Pour ce qui est de l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    Il faut savoir que le C (ou du moins les anciennes normes de C) permet(taient ) de considérer que tout symbole qui ne serait pas connu du compilateur et pouvant passer pour représenter un type soit, par défaut, considéré comme étant un int.

    C++ est beaucoup plus intransigeant à ce sujet : il doit connaitre les symboles qu'il peut utiliser comme étant des types .

    Il y a donc de fortes chances que le compilateur se plaigne de la même chose : soit il ne sait pas ce que représente AFX_INLINE, soit il ne sait pas ce que représente HTASK.

    Une même cause ayant les mêmes effets, lorsque tu auras trouvé dans quel fichier d'en-tête sont définis ces deux symboles (en donnant priorité à AFX_INLINE selon moi) et que tu l'auras (les auras) inclus avant d'inclure le fichier afxv_w32.h, le compilateur sera content et acceptera d'aller plus loin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2013
    Messages : 230
    Points : 543
    Points
    543
    Par défaut
    Merci beaucoup pour ta réponse. Je comprends mieux cette erreur de int maintenant, je suis bien plus relaxé


    Il faudrait donc essayer de fouiller dans les fichiers d'en-tête afin de trouver celui dans lequel ce symbole (AFX_INLINE) est déclaré et veiller à l'inclure AVANT l'inclusion de afxv_w32.h
    Le fait est que c'est bien dans afxv_w32.h que se trouve l'erreur. Je vais essayer de trouver la définition de AFX_INLINE et / ou HTASK puis de l'inclure dedans. Je verrai bien.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par JackJnr Voir le message
    Le fait est que c'est bien dans afxv_w32.h que se trouve l'erreur. Je vais essayer de trouver la définition de AFX_INLINE et / ou HTASK puis de l'inclure dedans. Je verrai bien.
    Malheureux!!! Surtout pas !!!

    La règle d'or est : on ne modifie jamais un fichier qui ne nous appartient pas.

    Surtout lorsqu'on n'a pas les sources qui vont avec!

    Il faut comprendre comment le compilateur travaille : Il lit ton fichier exactement comme si tu lisais un livre du premier mot de la première ligne à la première page, au dernier mot de la dernière ligne à la dernière page.

    S'il trouve une instruction #include, il ouvre le fichier en question et commence à le lire.

    Si, dans le fichier qu'il lit, il rencontre un symbole qu'il ne connait pas, il n'est pas content, te le fait savoir, et s'arrête.

    Si tu veux corriger le problème, tu trouves l'endroit où sont définis les symboles AFX_INLINE et HTASK, et tu veilles à les inclure avant d'arriver à l'inclusion qui pose problème.

    Comme ce fichier aura été parcouru avant le fichier qui pose problème, il reconnaitra les symboles et il continuera son bonhomme de chemin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2013
    Messages : 230
    Points : 543
    Points
    543
    Par défaut
    Malheureux!!! Surtout pas !!!
    On sent bien ton cri du coeur qui traverse le temps et l'espace :p
    Plus sérieusement, je trouvais ça extrêmement crade aussi, et si je préfère coder proprement de manière générale, j'en arrive parfois à faire des choses crades sous l'impératif du moment.

    Merci pour les infos du compilo. Vu que mes formations de C remontent à loin, j'avais oublié que le fonctionnement du compilo. Je pensais que cela fonctionnait hiérarchiquement. En gros qu'il fallait inclure le fichier dans l'appelant. Je jetterai un oeil sur le fonctionnement du compilo quand j'aurai plus de temps.

    Néanmoins je trouve ça étrange qu'un fichier de Visual Studio demande à l'utilisateur de lui fournir du code alors qu'il est censé le déclarer nativement !

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/09/2010, 10h47
  2. Réponses: 8
    Dernier message: 01/08/2009, 16h31
  3. Réponses: 1
    Dernier message: 12/05/2009, 09h43
  4. Réponses: 18
    Dernier message: 16/07/2008, 01h18
  5. [Directives] Page blanche quand erreur de syntaxe
    Par syl2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/02/2006, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo