Re: Melanger C et C++ : exceptions ou setjmp ?
On Mon, 07 Jul 2008 11:43:34 +0200, Pascal J. Bourguignon
<pjb@informatimago.com> wrote:
> Fabien LE LEZ <gramster@gramster.com> writes:
>
>> Bonjour,
>>
>> J'essaie d'utiliser une bibliothèque écrite en C (libjpeg).
>> La gestion d'erreurs dans cette bibliothèque fonctionne comme suit :
>> on fournit une fonction "my_error_exit()", qui doit se démerder pour
>> arrêter le code. (La fonction par défaut appelle exit().)
>>
>> Dans cette fonction, je vois deux choix possibles :
>> 1- longjmp() (avec un setjmp() dans le code appelant)
>> 2- throw une_exception;
>>
>> Au moins sur mon compilateur (VC++ 2008), la première solution est
>> officiellement non gérée :
>> "Do not use setjmp and longjmp in C++ programs; these functions do not
>> support C++ object semantics."
>> <http://msdn.microsoft.com/en-us/library/yz2ez4as(VS.80).aspx>
>>
>> Lancer une exception serait bien agréable, mais j'ai cru lire qu'il ne
>> fallait pas laisser se propager une exception à travers du code C.
>>
>>
>> Pour l'instant, j'ai pondu une interface en C qui contient un paquet
>> de fonctions de ce style :
>>
>> boolean JpegStartDecompress (struct jpeg_decompress_struct* cinfo)
>> {
>> if (setjmp (error_manager.setjmp_buffer))
>> {
>> return 0;
>> }
>>
>> jpeg_start_decompress (cinfo);
>> return 1;
>> }
>>
>>
>> Si quelqu'un a une meilleure solution...
>
> Compiler la bibliothèque avec un compilateur C++ et utiliser les
> exceptions.
>
Très beau en théorie, mais en pratique, au moindre malloc sans cast, ca va
casser.
Et je passe sous silence les autres problèmes entre C et C++.
|