В чем разница между определением и декларацией?

Используя интерфейс Parcelable, вы можете передать пользовательский объект java в намерение.

1) реализовать интерфейс Parcelable для вашего класса, например:

class Employee implements Parcelable
{
}

2) Пропустить объект Parcelable в намерение, подобное:

Employee mEmployee =new Employee();
Intent mIntent = new Intent(mContect,Abc.class);
mIntent.putExtra("employee", mEmployee);
startActivity(mIntent);

3) Получить данные в новую активность [Abc], например:

Intent mIntent  = getIntent();
Employee mEmployee  = (Employee )mIntent.getParcelableExtra("employee");
802
задан MD XF 9 March 2017 в 18:49
поделиться

9 ответов

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

extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations

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

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};

Определение может использоваться вместо объявления.

Идентификатор можно объявлять сколь угодно часто. Таким образом, в C и C ++ допустимо следующее:

double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);

Однако он должен быть определен ровно один раз. Если вы забыли определить что-то, что было где-то объявлено и на которое ссылались, то компоновщик не Не знает, на что делать ссылки, и жалуется на недостающие символы. Если вы определяете что-то более одного раза, то компоновщик не знает , на какие определений нужно ссылаться, и жалуется на повторяющиеся символы.


Поскольку споры о том, что такое объявление класса по сравнению с определением класса в C ++, продолжаются (в ответах и ​​комментариях к другим вопросам), я вставлю цитату из стандарт C ++ здесь.
At 3.1/2, C++03 says:

A declaration is a definition unless it [...] is a class name declaration [...].

3.1/3 then gives a few examples. Amongst them:

[Example: [...]
struct S { int a; int b; }; // defines S, S::a, and S::b [...]
struct S; // declares S
—end example

To sum it up: The C++ standard considers struct x; to be a declaration and struct x {}; a definition. (In other words, "forward declaration" a misnomer, since there are no other forms of class declarations in C++.)

Thanks to litb (Johannes Schaub) who dug out the actual chapter and verse in one of his answers.

823
ответ дан 22 November 2019 в 21:17
поделиться

Существуют некоторые очень четкие определения, опрыснутые всюду по K& R (2-й выпуск); это помогает положить их на одно место и считать их как один:

"Определение" относится к месту, где переменная создается или присвоенное устройство хранения данных; "объявление" относится к местам, где природа переменной указана, но никакое устройство хранения данных не выделяется. [p. 33]

...

важно различать объявление внешней переменной и определение . Объявление объявляет о свойствах переменной (прежде всего, ее тип); определение также заставляет устройство хранения данных быть обойденным. Если строки

int sp;
double val[MAXVAL]

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

, С другой стороны, строки

extern int sp;
extern double val[];

объявляют для остальной части исходного файла, который sp является int и что val double массив (чей размер определяется в другом месте), но они не создают переменные или резервируют устройство хранения данных для них.

должен быть только один определение внешней переменной среди всех файлов, которые составляют исходную программу.... Размеры массива должны быть указаны с определением, но дополнительные с extern объявление. [стр 80-81]

...

Объявления указывают интерпретацию, данную каждому идентификатору; они не обязательно резервируют устройство хранения данных, связанное с идентификатором. Объявления, что резервное устройство хранения данных называют определения . [p. 210]

0
ответ дан 22 November 2019 в 21:17
поделиться

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

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

2
ответ дан 22 November 2019 в 21:17
поделиться

Источник: wiki.answers.com:

Термин «объявление» означает (в C), что вы сообщаете компилятору о типе, размере и, в случае объявления функции, о типе и размере ее параметры любой переменной, определенного пользователем типа или функции в вашей программе. Нет места в памяти зарезервировано для любой переменной в случае объявления. Однако компилятор знает, сколько места следует зарезервировать на случай создания переменной этого типа.

например, ниже приведены все объявления:

extern int a; 
struct _tagExample { int a; int b; }; 
int myFunc (int a, int b);

Определение, с другой стороны, означает, что в дополнение ко всем вещам, которые делает объявление, пробел также зарезервирован в памяти. Вы можете сказать «ОПРЕДЕЛЕНИЕ = ДЕКЛАРАЦИЯ + ЗАЩИТА ПРОСТРАНСТВА». Ниже приведены примеры определения:

int a; 
int b = 0; 
int myFunc (int a, int b) { return a + b; } 
struct _tagExample example; 

см. Ответы .

15
ответ дан 22 November 2019 в 21:17
поделиться

Объявление

Объявления сообщают компилятору, что программный элемент или имя существует. А декларация вводит один или несколько имена в программу. Заявления могут встречаются в программе более одного раза. Следовательно, классы, структуры, перечислимые типы и другие определяемые пользователем типы могут быть объявлены для каждая единица компиляции.

Определение

Определения определяют, какой код или данные название описывает. Имя должно быть declared before it can be used.

33
ответ дан 22 November 2019 в 21:17
поделиться

Объявление: «Где-то существует foo.»

Определение: «... и вот оно!»

131
ответ дан 22 November 2019 в 21:17
поделиться

From the C99 standard, 6.7(5):

A declaration specifies the interpretation and attributes of a set of identifiers. A definition of an identifier is a declaration for that identifier that:

  • for an object, causes storage to be reserved for that object;
  • for a function, includes the function body;
  • for an enumeration constant or typedef name, is the (only) declaration of the идентификатор.

Из стандарта C ++, 3.1 (2):

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

Затем есть несколько примеров.

Так интересно (или нет, но я немного удивлен этим), typedef int myint; - это определение на C99, но только объявление на C ++.

21
ответ дан 22 November 2019 в 21:17
поделиться

Из стандартного раздела C ++ 3.1:

Объявление вводит имена в единицу перевода или повторно объявляет имена, введенные предыдущим declarations. A declaration specifies the interpretation and attributes of these names.

The next paragraph states (emphasis mine) that a declaration is a definition unless...

... it declares a function without specifying the function’s body:

void sqrt(double);  // declares sqrt

... it declares a static member within a class definition:

struct X
{
    int a;         // defines a
    static int b;  // declares b
};

... it declares a class name:

class Y;

... it contains the extern keyword without an initializer or function body:

extern const int i = 0;  // defines i
extern int j;  // declares j
extern "C"
{
    void foo();  // declares foo
}

... or is a typedef or using statement.

typedef long LONG_32;  // declares LONG_32
using namespace std;   // declares std

Now for the big reason why it's important to understand the difference between a declaration and definition: the One Definition Rule. From section 3.2.1 of the C++ standard:

No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.

167
ответ дан 22 November 2019 в 21:17
поделиться

В C ++ есть интересные граничные случаи (некоторые из них и в C). Рассмотрим

T t;

Это может быть определение или объявление, в зависимости от типа T :

typedef void T();
T t; // declaration of function "t"

struct X { 
  T t; // declaration of function "t".
};

typedef int T;
T t; // definition of object "t".

В C ++ при использовании шаблонов существует еще один крайний случай.

template <typename T>
struct X { 
  static int member; // declaration
};

template<typename T>
int X<T>::member; // definition

template<>
int X<bool>::member; // declaration!

Последнее объявление было не определением. Это' s объявление явной специализации статического члена X . Он сообщает компилятору: «Если дело доходит до создания экземпляра X :: member , то не создавайте экземпляр определения члена из первичного шаблона, а используйте определение, найденное в другом месте». Чтобы сделать его определение, вы должны предоставить инициализатор

template<>
int X<bool>::member = 1; // definition, belongs into a .cpp file.
44
ответ дан 22 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: