1

Estoy haciendo un programa con funciones y una variable global, la idea era manejar una variable global en varias funciones, no conozco como hacer funciones globales, esto es lo que intente:

#include<cmath>
#include <stdio.h>
#include <iostream>

using namespace std;

int number=3;

void main(){
    cout<<number;
}

pero me marca de sintaxis en void main(){ no tengo ni idea de el porque si se supone que number es una variable global.

Cual es el problema?

DDR
  • 823
  • 5
  • 10
  • 21
  • ¿se podria saber cual es el mensaje de error? –  Jul 24 '18 at 00:39
  • Es de sintaxis, me falto escribir eso – DDR Jul 24 '18 at 00:42
  • Tienes cierta reputación por lo que deberias saber que *me marca un error* no es util, debes colocar el mensaje de error completo, muestralo por favor. –  Jul 24 '18 at 00:43
  • Soy nuevo en c++, y cuando esta compilando me subraya esta parte void main(){, pero como tal no muestra un mensaje de error, debe ser de sintaxis, me falto aclarar eso. – DDR Jul 24 '18 at 00:46
  • Entonces coloca una imagen del error :) –  Jul 24 '18 at 00:47
  • Y las sugerencias que te digo no solo son validas para preguntas relativas a C++ sino a cualquier pregunta en SO, por favor lee [ask] ;) –  Jul 24 '18 at 00:48
  • Lo tendré en cuenta gracias, pero ya solucione mi problema :) – DDR Jul 24 '18 at 00:52
  • Si algunas de las respuestas fue util para resolver tu problema entonces marcarla como correcta, si en cambio fue otro método por favor publicalo como respuesta y marcala como correcta –  Jul 24 '18 at 00:53
  • 1
    Existe una pregunta conceptual sobre este tema , en [Por qué es considerado una mala práctica utilizar variables globales?](https://es.stackoverflow.com/questions/29177/por-qu%C3%A9-es-considerado-una-mala-pr%C3%A1ctica-utilizar-variables-globales) – Dev. Joel Jul 24 '18 at 06:55

4 Answers4

6

Tu comprensión de las variables globales es correcto.

Tu error.

Tu problema no son las variables globales. Como ya han señalado otros usuarios tu función main es incorrecta; es incorrecta porque debe devolver int. El motivo de esta obligatoriedad es porque (tal y como dice el estándar del lenguaje C++) de lo contrario tu programa será incorrecto, te lo muestro directamente extraído del estándar (traducción y resaltado míos):

3.6.1.2 Función main

Las implementaciones no deben predefinir main. Esta función no debe ser sobrecargada. Debe declararse con un retorno de tipo int, pero en caso contrario su tipo es definido por implementación. Las implementaciones deben permitir:

  1. Una función () devolviendo int y
  2. Una función de (int, puntero a puntero a char) devolviendo int

Así que tu error de sintaxis es porque tu función main no sigue el estándar. Apuesto a que incluso el error que te muestra el compilador te está diciendo que dicha función debe devolver int.

Respecto las variables globales.

Intenta no usar variables globales:

  • Carecen de localidad: El código es más fácil de comprender cuando su ámbito es limitado. Las variables globales pueden ser leídas o modificadas desde cualquier parte del programa, esto hace difícil razonar sobre su uso o recordar todos los puntos en que se usan.
  • Carecen de control de acceso o verificación de restricciones: Una variable global puede ser leída o escrita desde cualquier parte del programa, varias reglas acerca de su uso pueden ser olvidadas o violadas.
  • Problemas de concurrencia: Si las variables globales pueden ser accedidas desde varios hilos, es necesario sincronizarlas. Cuando se trabaja con módulos dinámicamente enlazados que usan variables globales, el sistema resultante puede no ser seguro incluso cuando los módulos lo sean de manera independiente.
  • Contaminación del espacio de nombres: Las variables globales están en todos los contextos. Puedes acabar usando una variable global cuando creías estar usando una local ¡o viceversa! (ya sea por desconocimiento, escribir mal el nombre u olvidarte de crear la variable local). Además, si enlazas módulos con variables globales cuyo nombre sea igual, si tienes suerte, tendrás errores de enlazado... si no tienes suerte el enlazador considerará las variables como la misma incluso aunque no fuese tu intención.
  • Más problemas en el enlace (en Inglés): He traducido los puntos que creía que eran más relevantes para tu problema.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Gracias por la rta, si no es recomendable manejar variables globales, entonces que puedo hacer para manejar una variable con varias funciones? – DDR Jul 26 '18 at 01:15
  • Esa es una pregunta muy compleja que no es adecuado responder en un comentario, te aconsejo preparar un caso práctico y un código de ejemplo y elaborar una pregunta alrededor de ello. – PaperBirdMaster Jul 26 '18 at 06:18
  • Vale gracias, después hare una pregunta. – DDR Jul 27 '18 at 02:54
4

Veo dos errores aquí: primero, usas void main(){ donde debería ser int main, ¿por qué? porque vas a devolver un entero. El segundo error que veo es que no lo devuelves, o sea, no agregas un return, como en el siguiente código:

#include<cmath>
#include <stdio.h>
#include <iostream>

using namespace std;

int number=3;

int main(){

  cout<<number;
   return 0;
}

Te recomiendo leer esto :input_output en c++ y variables locales y globales en c++ int-main-vs-void-main-in-c

Shaz
  • 28,742
  • 18
  • 37
  • 61
simon
  • 2,343
  • 5
  • 23
  • 59
  • por favor mejora tu redacción, no coloques `?` innecesariamente, una respuesta de calidad debe ser correctamente escrita. –  Jul 24 '18 at 00:42
  • 1
    ok gracias por tu sugerencia la tomare en cuenta – simon Jul 24 '18 at 00:43
  • Simon te recomiendo devolver 0, por convencion el retorno de 0 indica que el programa se ejecuto sin problemas, otro valor indicara que hubo un problema. –  Jul 24 '18 at 00:49
  • ya lo agrege en el codigo – simon Jul 24 '18 at 00:53
  • A mi me preocupa el `return number;`, eso es incorrecto :) –  Jul 24 '18 at 00:54
  • ah perdon :) ya la edite la respuesta :) – simon Jul 24 '18 at 00:58
  • [Continuemos el debate en el chat](https://chat.stackexchange.com/rooms/80582/discussion-between-simon-and-eyllanesc). – simon Jul 24 '18 at 00:58
  • Solución rápida puede oler a solución apestosa, cuidese de ello, recuerde que en SO no solo deben de servir al que pregunta sino a los futuros lectores. –  Jul 24 '18 at 01:00
  • lose :) perdon intentare mejorar las respuesta. – simon Jul 24 '18 at 01:01
  • No es obligatorio incluir el `return 0;`. Revisa este enlace: https://es.stackoverflow.com/q/139624/63114 – Xam Jul 24 '18 at 19:14
  • te recomiendo leer esto: https://stackoverflow.com/questions/4138649/why-is-return-0-optional y http://www.cplusplus.com/forum/beginner/24461/ – simon Jul 24 '18 at 20:43
3

El problema es que la función main siempre es de tipo int y debe retornar un número.

#include<cmath>
#include <stdio.h>
#include <iostream>

using namespace std;

int number=3;

int main(){
    cout << number << '\n';
    return 0;
}

¿Qué es lo que quieres lograr al utilizar una variable global? No es recomendable utilizar variables globales y tal vez te interesa pasarla por referencia a tus funciones. Por ejemplo:

#include <iostream>
using namespace std;

void suma(int &n);

int main(){
  int numero = 0;
  suma(numero);
  cout << numero << '\n';
  suma(numero);
  cout << numero << '\n';
}

void suma(int &n){
 n = n + 10;
}
akko
  • 2,378
  • 2
  • 27
  • 56
  • ¿por qué no son recomendables las variables globales? –  Jul 24 '18 at 01:08
  • La razón principal por la cual las variables globales son peligrosas se debe a que sus valores pueden ser cambiados por cualquier función que se llame, y no hay una manera fácil para que el programador sepa que esto sucederá. te recomiendo leer esto : http://www.learncpp.com/cpp-tutorial/4-2a-why-global-variables-are-evil/ y https://stackoverflow.com/questions/484635/are-global-variables-bad – simon Jul 24 '18 at 01:50
  • @Simon mi pregunta va en el sentido que cuando se afirma algo no solo basta la afirmación sino que se debe indicar los motivos en la respuesta –  Jul 24 '18 at 02:16
  • el motivo es sencillamente el control de las variables por ejemplo si existe otra variable similar en otra class de c++ y choca con esta puede sobre escribirla y el programador nunca sabria que pasa esto, es como en java o php el limite de las variable – simon Jul 24 '18 at 02:29
  • @Simon como recalco conozco la razon de ello, pero mi cuestion va que akko mejore su pregunta explicando el motivo de esa frase o señalando la literatura que lo sustenta. –  Jul 24 '18 at 03:29
  • ah ok ups , ps esperemos que el usuario la edite y explique – simon Jul 24 '18 at 03:36
1

Prueba esta sintaxis, ¿por qué? porque es un estandar en C/C++, un int main y su respectivo return 0.

#include<cmath>
#include <stdio.h>
#include <iostream>

using namespace std;

int number=3;

int main(){
    cout<<number;

    return 0;
}
darioxlz
  • 596
  • 3
  • 9
  • 29
  • Una respuesta de calidad no solo puede decir *prueba esto*, que quiere decir *quizas funcione*, debes explicar porque lo que propones es la solución y cual es la causa del problema, lee por favor [answer] y mejora tu respuesta –  Jul 24 '18 at 00:40
  • dijo lo mismo debes mejorar tu respuesta – simon Jul 24 '18 at 00:59
  • 2
    No *es una buena práctica, un `int main`*, es la única práctica posible. El estándar de C++ establece que la función `main` **debe** devolver `int`. A @DDR no le funcionaba porque su programa era erróneo precisamente por no seguir las normas del estándar. – PaperBirdMaster Jul 24 '18 at 06:25
  • -1 porque no se trata de buenas prácticas. El asunto es seguir lo que indica el estándar de C++. – Xam Jul 24 '18 at 19:10
  • Ya corregí mi publicación – darioxlz Jul 24 '18 at 23:53