Existe-t-il une option gcc permettant de supposer que toutes les fonctions «C» externes ne peuvent pas propager des exceptions?

Existe-t-il un moyen, à part de mettre un atsortingbut sur chaque prototype de fonction, pour faire savoir à gcc que les fonctions C ne peuvent jamais propager d’exceptions, c’est-à-dire que toutes les fonctions déclarées dans extern "C" doivent être __atsortingbute__((nothrow)) ? Idéal serait une option de ligne de commande de style -f .

Vous pouvez toujours utiliser -fno-exceptions pour vous assurer que le compilateur c ++ ne génère pas de code de propagation d’exception.

Note de côté:
Etes-vous sûr de dire au compilateur “Tous ces fonctions ne jettent jamais” est exactement ce que vous voulez?

Ce n’est pas nécessairement pour que les fonctions extern "C" ... ne puissent pas propager / déclencher des exceptions. Prenons un exemple concret:

 class Foo { public: class Away {}; static void throwaway(void) { throw Away(); } } extern "C" { void wrap_a_call(void (*wrapped)(void)) { wrapped(); } } int main(int argc, char **argv) { wrap_a_call(Foo::throwaway); return 0; } 

En compilant et en exécutant ceci, vous wrap_a_call() fonction de liaison C, wrap_a_call() qui, lorsqu’elle est appelée comme ci-dessus, provoquera une exception:

 $ ./test terminate called after throwing an instance of 'Foo::Away' Abort(coredump) 

Par exemple, il peut y avoir une “fuite d’exception” avec extern "C" (via des pointeurs de fonction invoquants) et le fait que vous utilisiez / invoquiez des fonctions extern "C" à un endroit particulier du C ++ ne garantit pas qu’aucune exception ne puisse être levée lors de l’appel. ceux.

Quand une exception est levée, elle génère une interruption qui déroule la stack et remplace la stack existante. Cela va jusqu’au point où try / except syntax est. Cela signifie que vous n’avez pas de surcharge si vous n’utilisez pas d’exceptions. Seul le temps système en mémoire / temps correspond aux blocs try / catch et à la stack se déroulant à la projection ().

Si vos fonctions c ne génèrent pas d’exceptions, votre surcharge ne sera dans l’espace que lorsque vous appelez try / catch dans votre C ++, mais est identique pour un nombre quelconque d’exceptions. (et peu de temps en début d’initialisation de ce petit espace constant).

GCC 4.5 semble les optimiser automatiquement. En effet, cette ligne apparaît dans la liste des modifications sur http://gcc.gnu.org/gcc-4.5/changes.html :

  • GCC optimise maintenant le code de gestion des exceptions. En particulier, les zones de nettoyage dont il est prouvé qu’elles n’ont aucun effet sont optimisées.