Не компилируется pthread_mutex (Простейший код!)

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

Не компилируется pthread_mutex

Сообщение Zeus »

Код:

#include <pthread.h> int main (int argc, char** argv) { pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t m; if (argc>1) m = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; else m = PTHREAD_MUTEX_INITIALIZER; return 0; }


Ругается на строчку с инициализатором мьютекса.
Причём не на первую (m1), а на ту, которая в if'е
Посмотрел на инициализаторы - это define'ы да к тому же define'ы в структуры.
Видимо из-за этого компилер ругается, но как победить - никак не пойму!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Не компилируется pthread_mutex

Сообщение Uncle_Theodore »

Zeus писал(а):
08.04.2007 01:03

Код:

#include <pthread.h> int main (int argc, char** argv) { pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t m; if (argc>1) m = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; else m = PTHREAD_MUTEX_INITIALIZER; return 0; }


Ругается на строчку с инициализатором мьютекса.
Причём не на первую (m1), а на ту, которая в if'е
Посмотрел на инициализаторы - это define'ы да к тому же define'ы в структуры.
Видимо из-за этого компилер ругается, но как победить - никак не пойму!

Компилируй вот так

Код: Выделить всё

gcc -lpthread -D_GNU_SOURCE <filename>.c -o <...>


http://marc.info/?l=glibc-alpha&m=1107...9230611&w=2
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

Uncle_Theodore писал(а):
08.04.2007 01:15
Компилируй вот так

Код: Выделить всё

gcc -lpthread -D_GNU_SOURCE <filename>.c -o <...>


http://marc.info/?l=glibc-alpha&m=1107...9230611&w=2

Я компилирую g++ (просто я этот код выдрал из другого проекта - на C++).
И дело тут не в том, что компилер не видит иницализаторы мьютексов - всё он видит.
Проблема - в чистом синтаксисе.
"parsing error" короче говоря.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Не компилируется pthread_mutex

Сообщение Uncle_Theodore »

Zeus писал(а):
08.04.2007 01:25
Я компилирую g++ (просто я этот код выдрал из другого проекта - на C++).
И дело тут не в том, что компилер не видит иницализаторы мьютексов - всё он видит.
Проблема - в чистом синтаксисе.
"parsing error" короче говоря.

То есть, включение флага -D_GNU_SOURCE в опции компилятора не помогает, или ты не пробовал?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

Uncle_Theodore писал(а):
08.04.2007 01:29
То есть, включение флага -D_GNU_SOURCE в опции компилятора не помогает, или ты не пробовал?

Ну я компильнул ради интереса gcc'шником.
Он ругнулся на инициализаторы (undefined и всё такое).
Добавил указанную опцию - эта ошибка пропала, но та, изначальная - осталась.
У неё другая природа - синтаксическая.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Не компилируется pthread_mutex

Сообщение Uncle_Theodore »

Угу. Вижу.

Могу только хак предложить

Код: Выделить всё

#include <pthread.h>
int
main (int argc, char** argv)
{
pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;

if (argc>1)
{
  pthread_mutex_t m = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
}
 else
   {
     pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
   }
return 0;
}

Не знаю, будет ли работать.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

Это компилится, но не то, что нужно: тут создаются два разных объекта-mutex.
А мне надо один проинициализировать или одним "значением" или другим.
:unsure:
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Не компилируется pthread_mutex

Сообщение v04bvs »

В подобных случаях надо смотреть вывод препроцессора.
У меня он выдал такое:

Код: Выделить всё

    if (argc>1) m = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
     else m = {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, { 0, 0 }};

struct literals в C нету, есть только initializers, вот он и ругается.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

v04bvs писал(а):
08.04.2007 02:29
В подобных случаях надо смотреть вывод препроцессора.
У меня он выдал такое:

Код: Выделить всё

    if (argc>1) m = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
     else m = {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, { 0, 0 }};

struct literals в C нету, есть только initializers, вот он и ругается.

А что, у всех разные ошибки выдаёт?
У меня на undefined чего-нибудь - не ругается.
Говорит синтаксическая ошибка.
Я компилирую g++ и вывод препроцессора уже смотрел - всё он видит.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Не компилируется pthread_mutex

Сообщение v04bvs »

Zeus писал(а):
08.04.2007 09:35
А что, у всех разные ошибки выдаёт?
У меня на undefined чего-нибудь - не ругается.
Говорит синтаксическая ошибка.
Я компилирую g++ и вывод препроцессора уже смотрел - всё он видит.

Не понял. Я говорю, что код, в который раскрываются define-ы синтаксически неверен. Компилятор всё правильно говорит.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

v04bvs писал(а):
08.04.2007 15:52
Не понял. Я говорю, что код, в который раскрываются define-ы синтаксически неверен. Компилятор всё правильно говорит.

Чем он синтаксически-то неверен?
У меня вывод препроцессора не такой: оба присваивания - присваивания структур.
Никаких там undefined'ов нету.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Не компилируется pthread_mutex

Сообщение v04bvs »

Zeus писал(а):
08.04.2007 21:21
Чем он синтаксически-то неверен?

Тем, что m = {...} в C писать нельзя. Можно писать struct M m = {...} - это называется инициализация. А использовать инициализаторы как обычные литералы нельзя. Правила такие.

А undefined тут не при чём, у меня константы написаны потому что я в препроцессор забыл передать _GNU_SOURCE
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

v04bvs писал(а):
08.04.2007 21:34
Тем, что m = {...} в C писать нельзя. Можно писать struct M m = {...} - это называется инициализация. А использовать инициализаторы как обычные литералы нельзя. Правила такие.

Я ж не gcc, а g++ компилю.
Инициализируй мьютекс без if'а - всё прокатит.
Добавишь назад - не компилится.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Не компилируется pthread_mutex

Сообщение v04bvs »

Zeus писал(а):
08.04.2007 22:55
Я ж не gcc, а g++ компилю.

А при чём тут g++ ? Отличие gcc от g++ в флагах, которые они передают линкеру, реально компилит cc1plus (как я понял про С++ идёт речь). Так нельзя делать ни в С, ни в С++.

Инициализируй мьютекс без if'а - всё прокатит.

if тут не при чём. Пойми разницу между
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

и
pthread_mutex_t m;
m = PTHREAD_MUTEX_INITIALIZER;

Эти конструкции хоть и выглядят похоже, но означают разные вещи. И вторая в С и С++ недопустима, в отличие от первой.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Не компилируется pthread_mutex

Сообщение elide »

Zeus, ты что ли глупый?
тебе три раза сказали, почему это не работает, работать не должно и, соответственно, не будет.
и без if будет абсолютно та же самая ситуация. если уж тебе очень хочется сотворить то, что вообще-то нормальный человек хотеть не должен, то сделай так

Код: Выделить всё

#include <pthread.h>
int main (int argc, char** argv){
   pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;

   pthread_mutex_t ERR = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
   pthread_mutex_t PLAIN = PTHREAD_MUTEX_INITIALIZER;
   pthread_mutex_t m;
   if (argc>1)
      m = ERR;
   else
      m = PLAIN;
   return 0;
}
слава роботам!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

Всем спасибо.
В причину проблемы въехал.

elide писал(а):
09.04.2007 01:00
Zeus, ты что ли глупый?
тебе три раза сказали, почему это не работает, работать не должно и, соответственно, не будет.

"Сказали" - в последних двух постах.
До этого как-то разговор о другом шёл.

elide писал(а):
09.04.2007 01:00
сделай так[code]#include <pthread.h>
...

В качестве рабочего варианта я такой и держал, но он мне не очень нравится.
Придётся оставить насовсем.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Не компилируется pthread_mutex

Сообщение elide »

v04bvs тебе семь постов назад сказал, что
struct literals в C нету, есть только initializers, вот он и ругается.
и это было как раз про то.
и ни о чем другом тут разговор не шёл...
слава роботам!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Не компилируется pthread_mutex

Сообщение Zeus »

elide писал(а):
09.04.2007 08:33
v04bvs тебе семь постов назад сказал, что и это было как раз про то.
и ни о чем другом тут разговор не шёл...

При этом сбил с толку выводом своего препроцессора, который, почему-то, не нашёл define для PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
:rolleyes:

Да ладно, проехали: с проблемой разобрались.
Спасибо.
Спасибо сказали: