Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C] глобальное объявление

40K
25 ноября 2009 года
himas
31 / / 13.11.2009
есть 2 исходных файла, в первом использую объявление:
 
Код:
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *somefunc()
{
    struct qlist *QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
}

во втором пытаюсь использовать те же переменные:
 
Код:
void somefunc2()
{
    extern pthread_mutex_t mutex;
    extern struct qlist *QueryList;
   
    struct qlist *last = QueryList;
    pthread_mutex_lock(&mutex);
}

компилятор выдает ошибки:
Цитата:

undefined reference to `QueryList'
undefined reference to `mutex'



ошибки возникают не при объявлении, а именно при использовании данных переменных во втором исходнике (последние 2 строки)

вопрос - почему возникают ошибки и как с ними бороться?

34K
25 ноября 2009 года
muturgan
96 / / 01.10.2009
Цитата: himas

компилятор выдает ошибки:



Как Вы компилите? Похоже, что вы неправильно линкуете.

12K
25 ноября 2009 года
Ghox
297 / / 26.07.2009
Цитата: himas
компилятор выдает ошибки:


ошибки возникают не при объявлении, а именно при использовании данных переменных во втором исходнике (последние 2 строки)

вопрос - почему возникают ошибки и как с ними бороться?


Почему возникают ошибки - см. комментарии в коде:

Код:
[COLOR="Red"]// переменная объвлена как глобальная static-переменная
// что означает, что она видна только в коде из этого файла
// и в других файлах уже не видна, даже если она там объявлена с помощью extern[/COLOR]
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *somefunc()
{
    [COLOR="Red"]// переменная объявлена как локальная внутри функции
    // и соответственно видна только внутри функции, и больше нигде[/COLOR]
    struct qlist *QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
}

Чтобы ошибок не было - нужно в первом файле объявить обе переменные как глобальные, без слова static:
 
Код:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct qlist *QueryList;

void *somefunc()
{
    *QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
}
40K
25 ноября 2009 года
himas
31 / / 13.11.2009
спасибо за помощь

для протокола и для тех, кто попадет сюда из поисковиков:
 
Код:
*QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));

выдаст ошибку "несовместимые типы в присваивании", поэтому лучше будет сделать так:
 
Код:
QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
12K
25 ноября 2009 года
Ghox
297 / / 26.07.2009
Насчет несоответствия типов - верно, это уже я ошибся и недосмотрел - значок '*' здесь нужно указывать только при объявлении указателя. А при присваивании указателю какого-либо значения (в том числе и значения указателя на выделенную malloc область памяти), когда оно производится не одновременно с объявлением - нужно без знака '*', т.к. этот знак в таком контексте обозначает операцию разыменования, которая при использовании malloc явно не к месту.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог