#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'ы в структуры.
Видимо из-за этого компилер ругается, но как победить - никак не пойму!
#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'ы в структуры.
Видимо из-за этого компилер ругается, но как победить - никак не пойму!
Я компилирую g++ (просто я этот код выдрал из другого проекта - на C++).
И дело тут не в том, что компилер не видит иницализаторы мьютексов - всё он видит.
Проблема - в чистом синтаксисе.
"parsing error" короче говоря.
Я компилирую g++ (просто я этот код выдрал из другого проекта - на C++).
И дело тут не в том, что компилер не видит иницализаторы мьютексов - всё он видит.
Проблема - в чистом синтаксисе.
"parsing error" короче говоря.
То есть, включение флага -D_GNU_SOURCE в опции компилятора не помогает, или ты не пробовал?
То есть, включение флага -D_GNU_SOURCE в опции компилятора не помогает, или ты не пробовал?
Ну я компильнул ради интереса gcc'шником.
Он ругнулся на инициализаторы (undefined и всё такое).
Добавил указанную опцию - эта ошибка пропала, но та, изначальная - осталась.
У неё другая природа - синтаксическая.
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++ и вывод препроцессора уже смотрел - всё он видит.
А что, у всех разные ошибки выдаёт?
У меня на undefined чего-нибудь - не ругается.
Говорит синтаксическая ошибка.
Я компилирую g++ и вывод препроцессора уже смотрел - всё он видит.
Не понял. Я говорю, что код, в который раскрываются define-ы синтаксически неверен. Компилятор всё правильно говорит.
Тем, что m = {...} в C писать нельзя. Можно писать struct M m = {...} - это называется инициализация. А использовать инициализаторы как обычные литералы нельзя. Правила такие.
А undefined тут не при чём, у меня константы написаны потому что я в препроцессор забыл передать _GNU_SOURCE
Тем, что m = {...} в C писать нельзя. Можно писать struct M m = {...} - это называется инициализация. А использовать инициализаторы как обычные литералы нельзя. Правила такие.
Я ж не gcc, а g++ компилю.
Инициализируй мьютекс без if'а - всё прокатит.
Добавишь назад - не компилится.
А при чём тут g++ ? Отличие gcc от g++ в флагах, которые они передают линкеру, реально компилит cc1plus (как я понял про С++ идёт речь). Так нельзя делать ни в С, ни в С++.
Инициализируй мьютекс без if'а - всё прокатит.
if тут не при чём. Пойми разницу между
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
и
pthread_mutex_t m;
m = PTHREAD_MUTEX_INITIALIZER;
Эти конструкции хоть и выглядят похоже, но означают разные вещи. И вторая в С и С++ недопустима, в отличие от первой.
Zeus, ты что ли глупый?
тебе три раза сказали, почему это не работает, работать не должно и, соответственно, не будет.
и без if будет абсолютно та же самая ситуация. если уж тебе очень хочется сотворить то, что вообще-то нормальный человек хотеть не должен, то сделай так