2015-03-06 5 views
0

Этот вопрос трудно описать, я постараюсь изо всех сил. Хорошо, вот деталь:определить `extern` var на языке C, xcode отправить« Неопределенные символы для архитектуры x86_64 »

  1. У меня есть файл открытых голов, названный header.h;
  2. определить a extern int a; в header.h;
  3. введите test1.c и укажите header.h;
  4. использовать var a в test1.c, но xcode дать ошибку: Undefined symbols for architecture x86_64;

Я попытался удалить extern, и этот вопрос ушел. Я искал extern в google, они сказали, что если вы не добавите extern, xcode автоматически добавит extern. Фактически существует разница между добавлением extern и добавьте extern по xcode. В чем тут разница?

ответ

7

Когда вы объявляете переменную extern, это обещание компилятору: «Поверьте мне, это будет там, когда вам это нужно». Он не делает переменную, он просто сообщает компилятору, что он где-то объявлен, а компилятору не нужно знать, где.

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

Когда вы забрали extern, который превратил обещание переменной в фактическое объявление. Компилятор не должен был вам верить, он просто сделал переменную, как вы сказали. Но поскольку это было в заголовке, если вы включили эту переменную в два разных файла кода и скомпилировали их в отдельные объектные файлы, когда вы попытались связать их, вы получите ошибку о дублирующих символах. Правильный способ использования extern состоит в том, чтобы объявить переменную extern в файле заголовка, а затем объявить ее реальным в файле реализации (.c).

header.h:

#ifndef HEADER_H 
#define HEADER_H 

extern int a; 

#endif 

test1.c

#include "header.h" 

int a = 5; 

... 

Тогда вы можете получить доступ к одной переменной a из другого файла Си.

test2.c

#include "header.h" 

int foo() { 
    return a; 
} 
+0

Спасибо, ответ совершенно ясен. Я просто слышу о «extern», но я не знал. Это будет полезно. Большое спасибо. – saitjr