2015-06-22 2 views
2

Это может показаться простым в глазах, но этот вопрос меня зудит разными способами.Декларация и определение в программировании на языке C с использованием extern

  1. мой вопрос об объявлении и защите от переменных в c.

В этом разделе есть действительно много объяснений в Интернете, и есть не одно решение этой проблемы, так как в этой проблеме помещено много точек обзора. Я хочу знать ясное существование этой проблемы.

int a; 

просто принять это это заявление или определение ?, это одно, когда я использую printf, он имеет 0 в качестве значения и адреса в качестве 2335860. но если это объявление, то как же выделяется память для этого.

int a; 
int a; 

, когда я делаю это он говорит предыдущее заявление о «а» здесь и переопределение «а», без связи.

  1. Некоторые источники утверждают, что разрешенное разрешено в c, а некоторые говорят, что это правда?

+0

'Int А;' в локальной области видимости, 'Е ("% d \ п", а)' ... БУМ ... [неопределенное поведение] (https://en.wikipedia.org/wiki/Undefined_behavior). –

ответ

5

int a; просто принять это это заявление или определение?

int a; если в глобальной перспективе это условное определение. Это означает, что если никакие другие определения не доступны в текущем блоке компиляции, рассматривайте это как определение, иначе это объявление.

От 6.9.2 Внешние определения объектов в спецификации C11:

Декларация идентификатора для объекта, который имеет файл прицел без инициализатора и без хранения класса спецификатором или с спецификатор класса хранения, статический, составляет предварительный пример определение. Если блок перевода содержит один или несколько предварительных определения для идентификатора, и блок перевода не содержит не внешнего определения для этого идентификатора, то поведение именно , как если единица перевода содержит области файл декларацию этого идентификатора с составным типом, как в конце блока перевода , с инициализатором равным 0.

int i4; // tentative definition, external linkage 
static int i5; // tentative definition, internal linkage 

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

некоторые источники говорят, переопределение допускается в с и некоторые говорят, Dont , что это правда?

Переобучение разрешено в C. Но переопределения нет.

Связанный вопрос: What is the difference between a definition and a declaration?

есть на самом деле много объяснений в интернете

Предпочитает хорошую книгу вместо Интернета, чтобы получить владение языком. Вы можете выбрать хорошую книгу от: The Definitive C Book Guide and List

+0

int a; int a; является декларацией или дефиницией в основном? –

+0

int a; int a; это говорит о переделке без привязки? –

+0

@aswinmythili Это означает, что ни одно из них не является явно декларацией. (Выполнено с помощью «extern») –

0

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

int a; 
int a; 

есть два определения a в той же области. Обеспечение связи с одним из них сделает компилятор счастливым

int a; 
extern int a; 
+0

int a; int a; это говорит о переделке без привязки? error –

+0

Это означает, что вам нужно обеспечить связь с одним из 'int a;', чтобы сделать его декларацией .. 'extern int a;'. – haccks