type structur recursive functions examples example dev c++ function global

recursive - structur c++



¿Cómo definir una función global en C++? (6)

Además de la respuesta de @Necrolis, el uso de estática está en desuso en lugar de espacios de nombres sin nombre . Sin embargo, el uso de espacios de nombres sin nombre y estática crea copias separadas para cada unidad de traducción, lo que aumenta el tamaño del binario. El uso de inline es mejor que ambos en este sentido.

Estas soluciones permiten más optimizaciones específicas de uso por los compiladores, pero son menos fáciles de almacenar en caché de instrucciones en comparación con la definición en un archivo fuente y luego se vinculan.

Me gustaría una función que no sea miembro de una clase y sea accesible desde cualquier clase.

Supongo que tendría que #include el archivo de encabezado donde se declara la función, pero no sé dónde definir esa función global.

¿Hay buenas razones para no tener esa función en primer lugar?


Debe declarar su prototipo en el archivo de encabezado y definirlo en el archivo de implementación.

//file.h void foo(); //file.cpp void foo () {}

Para responder brevemente a su segunda pregunta, se necesitan funciones globales cuando son utilizadas por varias clases y tipos diferentes de una manera genérica. Por ejemplo funciones matemáticas.

De lo contrario, en general, puede evitar tantas funciones globales. Además, debe evitar tener un miembro local static o datos globales asociados con dicha función (para no tener que preocuparse por la seguridad de subprocesos).


En un archivo de encabezado:

// someheader.h #ifndef MY_GLOBAL_FUN #define MY_GLOBAL_FUN void my_global_fun(); #endif

En un archivo de implementación:

#include "someheader.h" void my_global_fun() { // ... }

En otros archivos que requieran esa función:

#include "someheader.h" void f() { my_global_fun(); }

Las funciones gratuitas como esta son útiles y no hay muchos argumentos en contra de su uso. Dependiendo de su caso de uso, es probable que sea apropiado colocar estas funciones en un namespace de namespace específico para evitar la colisión de nombres con otras bibliotecas que pueda estar usando.


Lo que usted llama función global generalmente se denomina función gratuita y son una cosa buena .

Lo definiría como una función miembro de una clase, pero fuera del alcance de esa clase.

double squared(double x) { return x*x; }

Funciones simples que puede definir con la palabra clave en inline en el archivo de encabezado, o simplemente declararla allí

double squared(double x);

y ponga la implementación (primer ejemplo) en el archivo *.cpp .


Piense en main (). La función es algo así como ... allí. No está dentro de ninguna clase, estructura o espacio de nombres. Usted acaba de declarar y darle un cuerpo. Por supuesto, en el caso de las funciones que no son principales, es mejor colocar un prototipo en un encabezado y definirlo en un archivo .cpp.

Recuerde, C no tenía clases y las estructuras no podían mantener funciones de miembro. No había nada malo con las funciones libres entonces y no hay ahora.


necesitas un cuerpo (en un archivo cpp ):

int foo() { return 1; }

y una definición / prototipo en un archivo de encabezado, que se incluirá antes de cualquier uso de la función:

#ifndef MY_FOO_HEADER_ #define MY_FOO_HEADER_ int foo(); #endif

entonces usándolo en otro lugar:

#include foo.h void do_some_work() { int bar = foo(); }

o use una función en línea (no garantiza que esté en línea, pero es útil para funciones pequeñas, como foo ):

#ifndef MY_FOO_HEADER_ #define MY_FOO_HEADER_ inline int foo() { return 1; } #endif

como alternativa, puede abusar de las funciones basadas en encabezado de estilo C (por lo que esto va en un encabezado, la static obliga a existir en una sola unidad de compilación, sin embargo , debe evitar esto ):

#ifndef MY_FOO_HEADER_ #define MY_FOO_HEADER_ static int foo() { return 1; } #endif