El significado de ambos se me escapa.
c
declaration
terminology
definition
c++-faq
Maciek
fuente
fuente
Respuestas:
Una declaración introduce un identificador y describe su tipo, ya sea un tipo, objeto o función. Una declaración es lo que el compilador necesita para aceptar referencias a ese identificador. Estas son declaraciones:
Una definición en realidad instancia / implementa este identificador. Es lo que necesita el vinculador para vincular referencias a esas entidades. Estas son definiciones correspondientes a las declaraciones anteriores:
Se puede usar una definición en lugar de una declaración.
Un identificador se puede declarar con la frecuencia que desee. Por lo tanto, lo siguiente es legal en C y C ++:
Sin embargo, debe definirse exactamente una vez. Si olvida definir algo que ha sido declarado y referenciado en alguna parte, entonces el vinculador no sabe a qué vincular las referencias y se queja de la falta de símbolos. Si define algo más de una vez, el vinculador no sabe a qué definiciones vincular referencias y se queja de símbolos duplicados.
Dado que el debate sobre qué es una declaración de clase frente a una definición de clase en C ++ sigue apareciendo (en respuestas y comentarios a otras preguntas), pegaré una cita del estándar de C ++ aquí.
En 3.1 / 2, C ++ 03 dice:
3.1 / 3 luego da algunos ejemplos. Entre ellos:
Para resumir: el estándar C ++ considera
struct x;
que es una declaración ystruct x {};
una definición . (En otras palabras, "declaración hacia adelante" es un nombre inapropiado , ya que no hay otras formas de declaraciones de clase en C ++).Gracias a litb (Johannes Schaub) que desenterró el capítulo y el verso en una de sus respuestas.
fuente
extern int i
es una declaración, ya que solo introduce / especificai
. Puede tener tantosextern int i
en cada unidad de compilación como desee.int i
Sin embargo, es una definición. Denota el espacio para que el entero esté en esta unidad de traducción y aconseja al vinculador que vincule todas las referencias ai
esta entidad. Si tiene más o menos de una de estas definiciones, el vinculador se quejará.int i;
en archivo / alcance global o alcance de función es una definición tanto en C como en C ++. En C porque asigna almacenamiento, y en C ++ porque no tiene el especificador externo o una especificación de enlace. Esto equivale a lo mismo, que es lo que dice sbi: en ambos casos, esta declaración especifica el objeto al que deben vincularse todas las referencias a "i" en ese ámbito.struct A { double f(int, double); double f(int, double); };
inválido, por supuesto. Sin embargo, está permitido en otros lugares. Hay algunos lugares donde se puede declarar cosas, pero no definen, también:void f() { void g(); }
válida, pero no el siguiente:void f() { void g() { } };
. ¿Qué es una definición y qué declaración tiene reglas sutiles cuando se trata de plantillas? ¡Cuidado! +1 para una buena respuesta sin embargo.Desde el estándar C ++ sección 3.1:
El siguiente párrafo establece (énfasis mío) que una declaración es una definición a menos que ...
... declara una función sin especificar el cuerpo de la función:
... declara un miembro estático dentro de una definición de clase:
... declara un nombre de clase:
... contiene la
extern
palabra clave sin un inicializador o cuerpo de función:... o es una
typedef
ousing
declaración.Ahora, por la gran razón por la cual es importante entender la diferencia entre una declaración y una definición: la regla de una definición . De la sección 3.2.1 del estándar C ++:
fuente
struct x {static int b = 3; };
?b
que también se declareconst
. Consulte stackoverflow.com/a/3536513/1858225 y daniweb.com/software-development/cpp/threads/140739/… .Declaración: "En algún lugar, existe un foo".
Definición: "... y aquí está!"
fuente
Hay casos extremos interesantes en C ++ (algunos de ellos también en C). Considerar
Eso puede ser una definición o una declaración, dependiendo de qué tipo
T
es:En C ++, cuando se usan plantillas, hay otro caso límite.
La última declaración no fue una definición. Es la declaración de una especialización explícita del miembro estático de
X<bool>
. Le dice al compilador: "Si se trata de crear instanciasX<bool>::member
, no cree una instancia de la definición del miembro de la plantilla principal, sino que use la definición que se encuentra en otro lugar". Para que sea una definición, debe proporcionar un inicializadorfuente
Declaración
Definición
fuente
class foo {};
es una definición de clase , ¿no?Del estándar C99, 6.7 (5):
Una declaración especifica la interpretación y los atributos de un conjunto de identificadores. Una definición de un identificador es una declaración para ese identificador que:
Del estándar C ++, 3.1 (2):
Una declaración es una definición a menos que declare una función sin especificar el cuerpo de la función, contiene el especificador externo o una especificación de vinculación y ni un inicializador ni un cuerpo de función, declara un miembro de datos estáticos en una declaración de clase, es un declaración de nombre de clase, o es una declaración typedef, una declaración de uso o una directiva de uso.
Entonces hay algunos ejemplos.
De manera interesante (o no, pero me sorprende un poco),
typedef int myint;
es una definición en C99, pero solo una declaración en C ++.fuente
typedef
, ¿no significa eso que podría repetirse en C ++, pero no en C99?De wiki.answers.com:
El término declaración significa (en C) que le está informando al compilador sobre el tipo, tamaño y, en caso de declaración de función, tipo y tamaño de sus parámetros de cualquier variable, o tipo o función definidos por el usuario en su programa. No se reserva espacio en la memoria para ninguna variable en caso de declaración. Sin embargo, el compilador sabe cuánto espacio reservar en caso de que se cree una variable de este tipo.
por ejemplo, las siguientes son todas las declaraciones:
La definición, por otro lado, significa que además de todas las cosas que hace la declaración, el espacio también está reservado en la memoria. Puede decir "DEFINICIÓN = DECLARACIÓN + RESERVA DE ESPACIO" a continuación hay ejemplos de definición:
ver respuestas .
fuente
struct foo {};
es una definición , no una declaración. Una declaración defoo
seríastruct foo;
. A partir de eso, el compilador no sabe cuánto espacio reservar para losfoo
objetos.struct foo;
es una declaración, pero no le dice al compilador el tamaño de foo. Añadiría questruct _tagExample { int a; int b; };
es una definición. Entonces, en este contexto, es engañoso llamarlo una declaración. Por supuesto, es una, ya que todas las definiciones son declaraciones, pero parece estar sugiriendo que no es una definición. Es una definición, de _tagExample.Actualización de C ++ 11
Como no veo una respuesta pertinente a C ++ 11, aquí hay una.
Una declaración es una definición a menos que declare a / n:
enum X : int;
template<typename T> class MyArray;
int add(int x, int y);
using IntVector = std::vector<int>;
static_assert(sizeof(int) == 4, "Yikes!")
;
Cláusulas adicionales heredadas de C ++ 03 por la lista anterior:
int add(int x, int y);
extern int a;
oextern "C" { ... };
class C { static int x; };
struct Point;
typedef int Int;
using std::cout;
using namespace NS;
Una declaración de plantilla es una declaración. Una declaración de plantilla también es una definición si su declaración define una función, una clase o un miembro de datos estático.
Ejemplos del estándar que diferencia entre declaración y definición que encontré útil para comprender los matices entre ellos:
fuente
Definición :
La definición asocia la variable con un tipo y asigna memoria, mientras que la declaración solo especifica el tipo pero no asigna memoria. La declaración es más útil cuando desea hacer referencia a la variable antes de la definición.
* No confunda definición con inicialización. Ambos son diferentes, la inicialización le da valor a la variable. Ver el ejemplo anterior.
Los siguientes son algunos ejemplos de definición.
Ahora declaración de función:
Tenga en cuenta el punto y coma al final de la función, por lo que dice que es solo una declaración. El compilador sabe que en algún lugar del programa esa función se definirá con ese prototipo. Ahora, si el compilador obtiene una función, llame a algo como esto
El compilador arrojará un error diciendo que no existe tal función. Porque no tiene ningún prototipo para esa función.
Tenga en cuenta la diferencia entre dos programas.
Programa 1
En esto, la función de impresión se declara y define también. Dado que la llamada a la función viene después de la definición. Ahora vea el próximo programa.
Programa 2
Es esencial porque la llamada a la función precede a la definición, por lo que el compilador debe saber si existe tal función. Entonces declaramos la función que informará al compilador.
Definición :
Esta parte de definir una función se llama Definición. Dice qué hacer dentro de la función.
fuente
int a; //declaration; a=10; //definition
Esto está completamente mal. Cuando se habla de objetos de duración de almacenamiento automático (objetos declarados dentro de una definición de función que no se declara con otro especificador de clase de almacenamiento como extern), estas siempre son definiciones.definición significa función real escrita y declaración significa función simple para declarar, por ejemplo
y
esta es la definición de la función myfunction
fuente
Regla de oro:
Una declaración le dice al compilador cómo interpretar los datos de la variable en la memoria. Esto es necesario para cada acceso.
Una definición reserva la memoria para hacer que la variable exista. Esto tiene que suceder exactamente una vez antes del primer acceso.
fuente
Para entender los sustantivos, centrémonos primero en los verbos.
declarar : anunciar oficialmente; proclamar
definir - para mostrar o describir (alguien o algo) clara y completamente
Entonces, cuando declaras algo, solo dices qué es .
Esta línea declara una función llamada C
sum
que toma dos argumentos de tipoint
y devuelve unint
. Sin embargo, aún no puedes usarlo.Cuando proporcionas cómo funciona realmente , esa es la definición.
fuente
Para comprender la diferencia entre declaración y definición, necesitamos ver el código de ensamblaje:
y esta es solo la definición:
Como puedes ver nada cambia.
La declaración es diferente de la definición porque proporciona información utilizada solo por el compilador. Por ejemplo, uint8_t le dice al compilador que use la función asm movb.
Mira eso:
La declaración no tiene una instrucción equivalente porque no es algo que se ejecute.
Además, la declaración le dice al compilador el alcance de la variable.
Podemos decir que la declaración es una información utilizada por el compilador para establecer el uso correcto de la variable y por cuánto tiempo alguna memoria pertenece a cierta variable.
fuente
¿No podría decir en los términos más generales posibles, que una declaración es un identificador en el que no se asigna almacenamiento y una definición realmente asigna el almacenamiento de un identificador declarado?
Una idea interesante: una plantilla no puede asignar almacenamiento hasta que la clase o función esté vinculada con la información de tipo. Entonces, ¿el identificador de plantilla es una declaración o definición? Debería ser una declaración ya que no se asigna almacenamiento, y simplemente está 'creando prototipos' de la clase o función de plantilla.
fuente
template<class T> struct foo;
es una declaración de plantilla , y también lo estemplate<class T> void f();
. Las definiciones de plantilla reflejan las definiciones de clase / función de la misma manera. (Tenga en cuenta que el nombre de una plantilla no es un nombre de tipo o función . Un lugar donde puede ver esto es cuando no puede pasar una plantilla como parámetro de tipo de otra plantilla. Si desea pasar plantillas en lugar de tipos, necesita parámetros de plantilla de plantilla. )Encuentra respuestas similares aquí: Preguntas de la entrevista técnicos en C .
Una declaración proporciona un nombre al programa; Una definición proporciona una descripción única de una entidad (por ejemplo, tipo, instancia y función) dentro del programa. Las declaraciones pueden repetirse en un ámbito dado, introduce un nombre en un ámbito determinado.
Una declaración es una definición a menos que:
Una definición es una declaración a menos que:
fuente
Esto va a sonar realmente cursi, pero es la mejor manera en que he podido mantener los términos en mi cabeza:
Declaración: Imagine a Thomas Jefferson dando un discurso ... "¡DECLARO QUE ESTA FOO EXISTE EN ESTE CÓDIGO DE FUENTE!"
Definición: imagina un diccionario, estás buscando Foo y lo que realmente significa.
fuente
Una declaración presenta un nombre de símbolo al compilador. Una definición es una declaración que asigna espacio para el símbolo.
fuente
De acuerdo con el manual de la biblioteca GNU C ( http://www.gnu.org/software/libc/manual/html_node/Header-Files.html )
fuente
El concepto de Declaración y Definición formará una trampa cuando use la clase de almacenamiento externo porque su definición estará en otra ubicación y declarará la variable en su archivo de código local (página). Una diferencia entre C y C ++ es que en C usted las declaraciones se realizan normalmente al comienzo de una función o página de códigos. En C ++ no es así. Puede declarar en el lugar que elija.
fuente
Mi ejemplo favorito es "int Num = 5" aquí su variable es 1. definida como int 2. declarada como Num y 3. instanciada con un valor de cinco. Nosotros
Una clase o estructura le permite cambiar cómo se definirán los objetos cuando se use más tarde. Por ejemplo
Cuando aprendemos a programar estos dos términos a menudo se confunden porque a menudo hacemos ambos al mismo tiempo.
fuente
Etapas de una generación ejecutable:
En la etapa 2 (traductor / compilador), las declaraciones de declaración en nuestro código le dicen al compilador que estas cosas las vamos a usar en el futuro y puede encontrar la definición más adelante, el significado es:
y (3) la etapa (enlazador) necesita definición para unir las cosas
fuente
Hay algunas definiciones muy claras esparcidas por K&R (segunda edición); ayuda ponerlos en un solo lugar y leerlos como uno:
fuente
Declaración significa dar nombre y tipo a una variable (en caso de declaración de variable), por ejemplo:
o dar nombre, tipo de retorno y tipo de parámetro (s) a una función sin cuerpo (en caso de declaración de función), por ejemplo:
mientras que definición significa asignar valor a una variable (en caso de definición de variable), por ejemplo:
o proporcionar / agregar cuerpo (funcionalidad) a una función se denomina definición de función, por ejemplo:
muchas declaraciones y definiciones de tiempo se pueden hacer juntas como:
y:
En los casos anteriores definimos y declaramos variables
i
yfunction max()
.fuente
int x;