Erreur de syntaxe C2059 lors de l’utilisation de la macro declspec pour une fonction; comstack bien sans ça

J’ai créé une bibliothèque partagée (multiplate-forme), mais lorsque j’essaie de comstackr la version de Windows, je rencontre l’erreur:

secure_ssortingng.h (43): erreur C2059: erreur de syntaxe: ‘type’

Cela concerne la macro SECURESTRING_API. Il ne se plaint pas des deux utilisations de strlcpy et strlcat, mais en essayant de l’utiliser pour ‘str_from_last’, il génère l’erreur ci-dessus. Si je le supprime, la compilation est correcte, mais la fonction n’est pas exscope de la DLL, ce qui la rend tout à fait inutile!

Une recherche sur Google n’a donné aucun résultat (pertinent); Est-ce que quelqu’un a déjà rencontré cela auparavant? J’ai testé sur Visual Studio 2008 et 2010, et le résultat est identique. Le fichier source inclut ssortingng.h , puis ce fichier – rien d’autre.

header de fichier:

#ifndef SECURE_STRING_H #define SECURE_STRING_H /* Provide MS Builds with import/export functionality * BUILD_SECURE_STRING should be added to project preprocessor macros */ #if _WIN32 # if defined(BUILD_SECURE_STRING) # define SECURESTRING_API __declspec(dllexport) # else # define SECURESTRING_API __declspec(dllimport) # endif #else # define SECURESTRING_API #endif /* Windows on the whole, and glibc do not have/support strlc[at|py] * This will almost certainly need revision for proper cross-platform checks */ #if _WIN32 || __GLIBC__ || !defined(HAVE_STRLCPY) size_t SECURESTRING_API strlcat(char* dst, const char* src, size_t size); size_t SECURESTRING_API strlcpy(char* dst, const char* src, size_t size); #else # define HAVE_STRLCPY 1 #endif /* In case the active project has yet to include headers for 'BOOL' */ #ifndef BOOL # define BOOL int # define TRUE 1 # define FALSE 0 #endif /* | Locates 'search' within 'source', and if found, returns either the | character itself, or the character after it if 'return_from_after_found' | is TRUE. | If it is not found, or any parameter is invalid, a NULL pointer is returned. */ char* SECURESTRING_API str_from_last(char* source, char search, BOOL return_from_after_found); #endif /* SECURE_STRING_H */ 

 #if _WIN32 

Êtes-vous sûr que vous entrez ceci? Je voudrais:

 #if defined(WIN32) 

EDIT: Cela semble correct, mais voici ce que je pense: déplacez SECURESTRING_API avant le type de retour (char *):

 SECURESTRING_API char* 

Avec ce changement, votre code est compilé pour moi sous VS2010 et MSDN confirme que c’est l’ordre requirejs:

Decl-specifier-seq doit contenir, entre autres choses, un type de base (par exemple, int, float, un nom de classe ou un nom de classe), une classe de stockage (par exemple, statique, externe) ou l’extension __declspec. La liste init-declarator doit contenir, entre autres choses, la partie pointeur des déclarations.