Ошибка при компиляции программы на C - PullRequest
1 голос
/ 15 марта 2009

Я пытаюсь завершить проект для школы, включающий использование семафоров. Я включил правильные заголовочные файлы (плюс один для pthreads). Я также указал компилятору на правильные библиотеки. Это написано на C. Да, это задание, но, пожалуйста, учтите, что я не ищу помощи в реализации, скорее я не могу понять эту чертову ошибку компиляции.

Вот строки с 47 по 50 моего кода, которые являются «простыми» объявлениями семафоров и их инициализации:

sem_t empty;
sem_init(&empty, 0, 5); 
sem_t full;
sem_init(&full, 0, 0); 

Вот сообщения, которые я получаю, когда пытаюсь скомпилировать для строки 48. Я получаю тот же набор для строки 50, но для краткости не опубликовал его:

|48|error: expected declaration specifiers or ‘...’ before ‘&’ token|
|48|error: expected declaration specifiers or ‘...’ before numeric constant|
|48|error: expected declaration specifiers or ‘...’ before numeric constant|
|48|warning: data definition has no type or storage class|
|48|warning: type defaults to ‘int’ in declaration of ‘sem_init’|

Я объявил все это вне функции main (). Как я могу устранить эти ошибки? Я сбит с толку, потому что кажется, что он не указывает тип данных для sem_t, но он определен в semaphore.h, который я включил. Я компилирую это используя Code :: Blocks в Ubuntu, который использует gcc. Эта ошибка возникает даже при компиляции из командной строки.

Заранее спасибо за помощь.

1 Ответ

15 голосов
/ 15 марта 2009

Я думаю, что ваша проблема может быть связана с scoping .

«Я объявил все это вне функция main () "

звучит подозрительно, потому что я вижу, что вы вызываете функцию сразу после объявления.

Попробуйте перевести вызовы на sem_init внутри main

Вы можете объявлять вещи в области видимости файла (т.е. вне основной, эффективно создавая глобальную переменную), но вы не можете вызывать функции (например, sem_init) в области видимости файла. Они должны вызываться в области действия функции (например, внутри main())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...