Je suis actuellement à l'élaboration d'une bibliothèque C++ pour Windows qui sera distribuée sous forme d'une DLL. Mon objectif est de maximiser le binaire de l'interopérabilité; plus précisément, les fonctions dans ma DLL doit être utilisable à partir du code compilé avec plusieurs versions de MSVC++ et MinGW sans avoir à recompiler le DLL. Cependant, je suis confus au sujet de la convention d'appel est le meilleur, cdecl
ou stdcall
.
Parfois, j'entends des phrases comme: "la convention d'appel C est la seule garantie d'être le même à travers les compilateurs", qui contraste avec des déclarations comme "Il y a quelques variations dans l'interprétation de l' cdecl
, en particulier dans la façon de valeurs de retour". Cela ne semble pas arrêter certains de la bibliothèque de développeurs (comme libsndfile) pour utiliser la convention d'appel C dans les Dll qu'ils distribuent, sans que les problèmes soient visibles.
D'autre part, l' stdcall
convention d'appel semble être bien défini. De ce que j'ai dit, toutes les Fenêtres des compilateurs sont fondamentalement nécessaires à la suivre parce que c'est la convention utilisée pour Win32 et COM. Ceci est basé sur l'hypothèse qu'un compilateur Windows sans Win32/COM soutien ne serait pas très utile. Beaucoup de fragments de code posté sur des forums de déclarer des fonctions comme l' stdcall
mais je n'arrive pas à trouver un seul post qui explique clairement pourquoi.
Il y a trop d'informations contradictoires là-bas, et chaque recherche que j'ai exécutez me donne des réponses différentes qui n'aident pas vraiment à me décider entre les deux. Je suis à la recherche de claire, détaillée raisonnée explication des raisons pour lesquelles je devrais choisir entre l'un ou l'autre (ou pourquoi les deux sont équivalents).
Notez que cette question ne s'applique pas seulement à la "classique" de fonctions, mais aussi pour fonction membre virtuelle des appels, depuis plus de code client fera l'interface avec ma DLL à travers des "interfaces", pur classes virtuelles (suivant les modèles décrits par exemple ici et là).