2011-10-20 14 views
8

estoy tratando de entender algo de código C++ que tiene la sintaxis siguiente clase:¿Qué significa cuando una declaración de clase parece tener dos nombres?

class Q_MONKEY_EXPORT BasePlugin : public QObject 
{ 
    // some code comes here 
}; 

No puedo entender la sintaxis class Q_MONKEY_EXPORT BasePlugin. Para mí, parece que hay dos nombres para la clase. ¿Qué significa exactamente este tipo de sintaxis en C++?

+0

¿Duplicado (hasta cierto punto) de http://stackoverflow.com/questions/3148571/strange-class-declaration? –

+0

@LokiAstari ¿por qué es una tontería especificar qué símbolos exportar y cuales no? –

+0

@Omri Barel gracias por señalarme esa pregunta, mi búsqueda no tuvo éxito, es por eso que pregunté. – Amani

Respuesta

6

Q_MONKEY_EXPORT es probablemente un #define en algún lugar. A veces se requieren definiciones como esa, por ejemplo, cuando la clase se encuentra en una biblioteca y necesita ser exportada cuando el archivo de encabezado se incluye desde otro lugar. En ese caso, la definición se resuelve en algo como __declspec(dllexport) (la sintaxis exacta dependerá de las herramientas que esté utilizando).

6

Probablemente es una directiva de preprocesador que le dice al compilador que el símbolo se va a exportar.

Es probable que define como:

#define Q_MONKEY_EXPORT _declspec(dllexport) 

lo que hará que la clase A con destino a la dll.

La declaración completa se ampliará, antes de la compilación, a:

class _declspec(dllimport) BasePlugin : public QObject 
{ 
    // some code comes here 
}; 

EDIT:

Como David Heffernan señaló, las macros como éstos se utilizan generalmente para dejar que el compilador sabe si se necesita importar o exportar los símbolos. Generalmente se define como dllimport para módulos externos y dllexport al construir el módulo. Dudo que sea el caso aquí, ya que el nombre sugiere exportar, pero es mejor verificar la documentación o ir a la definición.

2

Q_MONKEY_EXPORT es una macro (todo en mayúsculas es la convención para la macro) que generalmente se resuelve a algo así como __declspec(dllexport) cuando se está construyendo la DLL y se resuelve a __declspec(dllimport) cuando se utiliza la DLL.

Puede averiguar exactamente de qué se trata leyendo sus archivos de inclusión.

Cuestiones relacionadas