static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *somefunc()
{
struct qlist *QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
}
[C] глобальное объявление
Код:
во втором пытаюсь использовать те же переменные:
Код:
void somefunc2()
{
extern pthread_mutex_t mutex;
extern struct qlist *QueryList;
struct qlist *last = QueryList;
pthread_mutex_lock(&mutex);
}
{
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 строки)
вопрос - почему возникают ошибки и как с ними бороться?
Цитата: himas
компилятор выдает ошибки:
Как Вы компилите? Похоже, что вы неправильно линкуете.
Цитата: himas
компилятор выдает ошибки:
ошибки возникают не при объявлении, а именно при использовании данных переменных во втором исходнике (последние 2 строки)
вопрос - почему возникают ошибки и как с ними бороться?
ошибки возникают не при объявлении, а именно при использовании данных переменных во втором исходнике (последние 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));
}
// что означает, что она видна только в коде из этого файла
// и в других файлах уже не видна, даже если она там объявлена с помощью 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));
}
struct qlist *QueryList;
void *somefunc()
{
*QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
}
для протокола и для тех, кто попадет сюда из поисковиков:
Код:
*QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
выдаст ошибку "несовместимые типы в присваивании", поэтому лучше будет сделать так:
Код:
QueryList = (struct qlist*)calloc(1, sizeof(struct qlist));
Насчет несоответствия типов - верно, это уже я ошибся и недосмотрел - значок '*' здесь нужно указывать только при объявлении указателя. А при присваивании указателю какого-либо значения (в том числе и значения указателя на выделенную malloc область памяти), когда оно производится не одновременно с объявлением - нужно без знака '*', т.к. этот знак в таком контексте обозначает операцию разыменования, которая при использовании malloc явно не к месту.