world tuto program first cpp c++ c compiler-construction

tuto - Contraparte del isset de PHP() en C/C++



program c++ (8)

Aquí hay que separar dos cosas: declaración de variables y contenido de variables.

Como se dijo en otras respuestas, a diferencia de PHP, C ++ no permite el uso de una variable antes de su declaración.

Pero aparte de eso, puede estar sin inicializar.

Creo que la función isset de PHP intenta averiguar si una variable tiene un valor utilizable. En C ++, esto se corresponde mejor con un puntero que sea NULO o válido.

PHP tiene una función muy buena, isset ($ variableName). Comprueba si $ variableName ya está definido en el programa o no.

¿Podemos construir una característica similar para C / C ++ (algún tipo de búsqueda de tabla de símbolos)?



Como se dijo en otras respuestas, en C ++ las variables nunca están indefinidas. Sin embargo, las variables no se pueden inicializar, en cuyo caso sus contenidos no se especifican en el estándar de lenguaje (y la mayoría de los compiladores implementan lo que sucedió para que se almacenaran en esa ubicación de memoria).

Normalmente, un compilador ofrece una bandera para detectar variables posiblemente no inicializadas y generará una advertencia si está habilitada.

Otro uso de isset podría ser tratar con código diferente. Recuerde que C ++ es un lenguaje compilado estáticamente e intentar redefinir un símbolo dará como resultado un error de tiempo de compilación, eliminando la necesidad de isset.

Finalmente, lo que podrías estar buscando es un puntero nulo. Para eso, solo usa una comparación simple:

int * x(getFoo()); if (x) { cout << "Foo has a result." << endl; } else { cout << "Foo returns null." << endl; }


Lo más cercano que puedo pensar es usar punteros en lugar de variables reales. Entonces puedes verificar fro NULL.

Sin embargo, parece que estás resolviendo un problema incorrecto para el idioma o usando un lenguaje incorrecto para resolverlo.


No hay medios directos para hacer esto en el lenguaje. Sin embargo, es posible hacer este tipo de cosas utilizando un mapa como el siguiente:

typedef std::map<std::string, int> variables_type; variables_type variables; variables["var"] = 1; if(variables.find("jon") == variables.end()) std::cout << "variable, /"jon/" not set/n";

Para hacer de esto una variable como las usadas en PHP o javascript, la implementación necesitaría usar algún tipo de tipo de variante.


Realmente no. No puede crear dinámicamente variables (aunque puede crear dinámicamente almacenamiento con malloc () et al, o nuevo et al. En C ++) en C. Supongo que las bibliotecas cargadas dinámicamente difuminan la imagen, pero incluso allí, la forma en que establece si la variable existe es buscando su nombre. Si el nombre no está allí, entonces, salvo ejecutar un compilador para crear un módulo cargado dinámicamente y luego cargarlo, probablemente esté atascado. El concepto realmente no se aplica a C o C ++.


Respuesta corta: NO

Pregunta de seguimiento estándar: ¿Qué problema estás tratando de resolver realmente ?


Soy un chico de C ++, pero recuerdo que en PHP isset se usa para verificar si una variable contiene un valor cuando se pasa a través de una solicitud get / post (estoy seguro de que hay otros usos, pero creo que es común) .

Realmente no tienes tipado dinámico en C ++. Por lo tanto, no puede usar de repente un nombre de variable que no haya definido explícitamente previamente. Realmente no existe una variable "desarmada" en C ++.

Incluso si dices "int var"; y no lo inicialice, la variable tiene un valor, generalmente basura, pero todavía está "configurado" en el sentido PHP.

El cierre, supongo, sería el #ifdef y el #ifndef del preprocesador, que solo verifica si ha definido una variable usando #define. Pero en mi experiencia esto se usa principalmente para omitir o agregar código basado en banderas. Por ejemplo:

// code code code #ifdef DEBUG // debug only code that will not be included in final product. #endif // more code more code

Puede definir DEBUG usando #define para determinar si se debe incluir el código "DEBUG" ahora.

Quizás contar un poco más sobre lo que estás tratando de hacer con el equivalente de C ++ de isset te dará una mejor idea de cómo hacerlo "The C ++ Way".