2011-12-06 9 views
9

Soy bastante nuevo en Lua, y quiero incluir a Lua en nuestro proyecto de juego usando C++. Lo primero que noto, Lua se permite compilar como código C++, y del doc, he aprendido que esto eliminará el 'C externo' envolviendo los encabezados de Lua, y también el manejo de errores será una excepción C++ en lugar de longjump/setjump.¿Cuál es el beneficio de compilar Lua como C++ aparte de evitar 'extern C' y obtener 'C++ exception'?

Mi pregunta es, además de estas dos diferencias, ¿hay algún otro beneficio real para compilar el código Lua como código C++? Estos dos no me convencen realmente, ya que, 1) no me molesta envolver los encabezados c con 'C externa', 2) nuestro proyecto no permite la excepción, así que tengo que cambiar en luaconf.h para usar longjump/setjump de cualquier manera.

Respuesta

9

Aquellos son los beneficios de compilar Lua como C++. Lo de extern "C" ni siquiera es realmente el punto; se trata de manejo de excepciones. Y aunque su aplicación prohíbe las excepciones, no todas las aplicaciones de C++ sí lo hacen.

Si está utilizando toda de C++, o bien tienen que tomar medidas para prevenir excepciones pase a través de Lua (no la cosa más fácil del mundo a menos que estés usando un envoltorio como Luabind) o para compilar Lua como C++.

No hay otros beneficios de compilar Lua como C++. El manejo de excepciones es el motivo por el que Lua se puede compilar como C++.

+1

Además de esto: "No permite excepciones" podría interpretarse dos caminos. 1. Ningún código de usuario puede lanzar excepciones o 2. Compila con excepciones desactivadas. La diferencia es que muchas cosas estándar arrojarán excepciones (como nuevas) en el caso 1. En esos casos, puede esperar un comportamiento "extraño" si una de esas excepciones alcanza un límite lua C-C++. –

+0

@MichaelAnderson: Es cierto, pero si ningún código de usuario arroja excepciones, ningún código de usuario * las captura * tampoco. Lo que significa que 'std :: bad_alloc' saltará al pasado principal y terminará la aplicación. La pila ni siquiera se desenrolla en ese caso. –

+0

@NicolBolas: Gracias por la explicación. Como dijiste, prohibimos el ** uso ** de excepción en el código de usuario, y tenemos Google Breakpad para atrapar todas las excepciones no controladas y simplemente dejar que nuestro juego termine. Es por eso que el manejo de excepciones en Lua no tiene sentido en nuestro caso. –

2

Otra forma de pensarlo podría ser voltear la pregunta y preguntar "¿Hay algún beneficio en compilar Lua en C (si ya estamos usando C++)?"

Si no hay ninguna ventaja para compilar Lua como C, y por lo que sé, no existe, y ya está usando C++ para su otro código, compilar Lua como C++ también parece más simple y potencialmente un poco más robusto, porque nunca tendrás marcos de pila que no sean de C++ para arruinar el rebobinado de la pila si una devolución de llamada a C++ de Lua pasa accidentalmente ...