В чем разница между определением и декларацией? - PullRequest
800 голосов
/ 11 сентября 2009

Значение обоих ускользает от меня.

Ответы [ 22 ]

4 голосов
/ 04 января 2017

Декларация:

int a; // this declares the variable 'a' which is of type 'int'

Таким образом, объявление связывает переменную с типом.

Ниже приведены некоторые примеры объявления.

int a;
float b;
double c;

Теперь объявление функции:

int fun(int a,int b); 

Обратите внимание на точку с запятой в конце функции, поэтому она говорит, что это всего лишь объявление. Компилятор знает, что где-то в программе эта функция будет определена с этим прототипом. Теперь, если компилятор получает вызов функции что-то вроде этого

int b=fun(x,y,z);

Компилятор выдаст сообщение о том, что такой функции нет. Потому что у него нет прототипа для этой функции.

Обратите внимание на разницу между двумя программами.

Программа 1

#include <stdio.h>
void print(int a)
{
     printf("%d",a);
}
main()
{
    print(5);
}

При этом функция печати также объявляется и определяется. Поскольку вызов функции идет после определения. Теперь посмотрите следующую программу.

Программа 2

 #include <stdio.h>
 void print(int a); // In this case this is essential
 main()
 {
    print(5);
 }
 void print(int a)
 {
     printf("%d",a);
 }

Это важно, потому что вызов функции предшествует определению, поэтому компилятор должен знать, есть ли такая функция. Поэтому мы объявляем функцию, которая сообщит компилятору.

Определение:

Эта часть определения функции называется Определение. Он говорит, что делать внутри функции.

void print(int a)
{
    printf("%d",a);
}

Теперь с переменными.

int a; //declaration
a=10; //definition 

Иногда объявление и определение группируются в одно утверждение, подобное этому.

int a=10;
4 голосов
/ 07 января 2011

определение означает фактическую написанную функцию, а объявление означает простую функцию объявления например,

void  myfunction(); //this is simple declaration

и

void myfunction()
{
 some statement;    
}

это определение функции myfunction

3 голосов
/ 03 октября 2017

Чтобы понять разницу между объявлением и определением, нам нужно увидеть код сборки:

uint8_t   ui8 = 5;  |   movb    $0x5,-0x45(%rbp)
int         i = 5;  |   movl    $0x5,-0x3c(%rbp)
uint32_t ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
uint64_t ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
double   doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
                        movsd   %xmm0,-0x8(%rbp)

и это только определение:

ui8 = 5;   |   movb    $0x5,-0x45(%rbp)
i = 5;     |   movl    $0x5,-0x3c(%rbp)
ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
               movsd   %xmm0,-0x8(%rbp)

Как видите, ничего не меняется.

Объявление отличается от определения, поскольку оно предоставляет информацию, используемую только компилятором. Например, uint8_t говорит компилятору использовать функцию asm movb.

Смотрите, что:

uint def;                  |  no instructions
printf("some stuff...");   |  [...] callq   0x400450 <printf@plt>
def=5;                     |  movb    $0x5,-0x45(%rbp)

Декларация не имеет эквивалентной инструкции, потому что ее не нужно выполнять.

Более того, объявление сообщает компилятору область действия переменной.

Можно сказать, что объявление - это информация, используемая компилятором для установления правильного использования переменной и как долго некоторая память принадлежит определенной переменной.

2 голосов
/ 12 марта 2014

Найдите похожие ответы здесь: Технические вопросы для интервью на C .

A объявление предоставляет имя программе; определение предоставляет уникальное описание объекта (например, типа, экземпляра и функции) в программе. Объявления могут повторяться в заданной области, это вводит имя в заданной области.

Декларация является определением, если:

  • Объявление объявляет функцию без указания ее тела,
  • Объявление содержит внешний спецификатор и не содержит инициализатор или тело функции,
  • Объявление - это объявление члена данных статического класса без определения класса,
  • Объявление - это определение имени класса,

Определение является декларацией, если:

  • Определение определяет член данных статического класса,
  • Определение определяет не встроенную функцию-член.
2 голосов
/ 11 сентября 2009

Не могли бы вы в самых общих терминах заявить, что объявление - это идентификатор, в котором не выделяется хранилище, а определение фактически выделяет хранилище из объявленного идентификатора?

Одна интересная мысль - шаблон не может выделять память, пока класс или функция не связаны с информацией о типе. Так является ли идентификатор шаблона декларацией или определением? Это должно быть объявление, поскольку хранилище не выделено, а вы просто «создаете прототип» класса или функции шаблона.

1 голос
/ 08 марта 2018

Согласно руководству библиотеки GNU C (http://www.gnu.org/software/libc/manual/html_node/Header-Files.html)

В C объявление просто предоставляет информацию о том, что функция или переменная существует, и дает ее тип. Для объявления функции также может быть предоставлена ​​информация о типах ее аргументов. Цель объявлений - позволить компилятору правильно обрабатывать ссылки на объявленные переменные и функции. С другой стороны, определение фактически выделяет память для переменной или говорит, что делает функция.

1 голос
/ 10 мая 2017

Объявление представляет имя символа для компилятора. Определение - это объявление, которое выделяет место для символа.

int f(int x); // function declaration (I know f exists)

int f(int x) { return 2*x; } // declaration and definition
1 голос
/ 03 июля 2013

Это будет звучать по-настоящему глупо, но это лучший способ, которым я смог держать слова в голове:

Декларация: Изображение Томаса Джефферсона, выступающего с речью ... "Я НАСТОЯЩИМ ОБЪЯВЛЯЮ, ЧТО ЭТО ФУО СУЩЕСТВУЕТ В ЭТОМ КОДЕКСЕ ИСТОЧНИКА !!!"

Определение: представьте себе словарь, вы ищете Foo и что он на самом деле означает.

1 голос
/ 03 января 2013

Объявление означает присвоение имени и типа переменной (в случае объявления переменной), например:

int i;

или дать имя, тип возвращаемого значения и тип (параметры) функции без тела (в случае объявления функции), например:

int max(int, int);

тогда как определение означает присвоение значения переменной (в случае определения переменной), например:

i = 20;

или предоставление / добавление тела (функциональности) к функции называется определением функции, например:

int max(int a, int b)
{
   if(a>b)   return a;
   return b;  
}

многократное объявление времени и определение могут быть сделаны вместе как:

int i=20;

и

int max(int a, int b)
{
    if(a>b)   return a;
    return b;    
} 

В вышеприведенных случаях мы определяем и объявляем переменные i и function max().

0 голосов
/ 08 августа 2018

Этапы исполняемого поколения:

(1) препроцессор -> (2) переводчик / компилятор -> (3) компоновщик

На этапе 2 (переводчик / компилятор) операторы объявления в нашем коде сообщают компилятору, что эти вещи мы будем использовать в будущем, и вы сможете найти определение позже, что означает:

переводчик удостоверится, что: что к чему? означает декларацию

и (3) stage (linker) нуждается в определении, чтобы связать вещи

Линкер убедитесь, что: где что? означает определение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...