Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,471
#1

Необходимо разобраться с директивами условной компиляции - C++

27.01.2012, 20:51. Просмотров 1870. Ответов 23
Метки нет (Все метки)

Друзья! Боюсь, что без предисловий не обойтись. Постараюсь, чтобы они были короткими. Поехали:
Часть кода:
C++
1
#include<semaphore.h>
Сообщение ккомпилятора:
Bash
1
include\semaphore.h:152 'mode_t' has not been declared
++++++++++++++++++++++++++++++++++++++++++++++++

Лезу в include\semaphore, вижу:
C++
1
2
3
4
PTW32_DLLPORT int __cdecl sem_open (const char * name,
                int oflag,
                mode_t mode,
                unsigned int value);
Начинаю поиски типа mode_t,выыше, в этом же файле include\semaphore.h наблюдаю такие объявления:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * This is a duplicate of what is in the autoconf config.h,
 * which is only used when building the pthread-win32 libraries.
 */
 
#ifndef PTW32_CONFIG_H
#  if defined(WINCE)
#    define NEED_ERRNO
#    define NEED_SEM
#  endif
#  if defined(__MINGW64__)
#    define HAVE_STRUCT_TIMESPEC
#    define HAVE_MODE_T
#  elif defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
#endif
//Тут всякие разные объявления
#ifndef HAVE_MODE_T
typedef unsigned int mode_t;
#endif

Ну волт, собсно говоря и всё. В былые времена я бы приписал не задумываясь:
C++
1
typedef unsigned int mode_t;
Но тут мне захотелось сыграть по правилам. То есть я так понимаю, что mode_t становится известным компилятору только если определена переменная __MINGW32__; а как правильно её определить? Знания, которые я почерпнул здесь
Препроцессорные директивы в C/C++ (#include, #define и прочее)
помогут мне просто написать:
C++
1
typedef unsigned int mode_t;
но повторюсь, хотелось бы сыграть по правилам, то есть разобраться для начала со строчкой:
C++
1
#ifndef PTW32_CONFIG_H
Ну и далее по порядку. Спасибо, кто откликнется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2012, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необходимо разобраться с директивами условной компиляции (C++):

Немогу разобраться с директивами - C++
Люди есть проблема. (с++) Значит учусь я в универе. А там IDE у нас короче очень древняя борланд`овская (для win 3.1). Так как для изучения...

Используя директивы условной компиляции разработать приложение, переводящие дюймы в сантиметры и наоборот - C++
Используя директивы условной компиляции разработать приложение, переводящие дюймы в сантиметры и наоборот. Диалог с пользователем...

Структуры+модульное ошибка компиляции помоогите разобраться - C++
При компиляции выдает ошибку на описании структуры в файле inputMarki.h ,в чем проблема помогите разобраться? Файл main.cpp ...

Необходимо разобраться с кодом - C++
Объясните пожалуйста что делает эта программа #include &lt;vector&gt; #include &lt;cstdio&gt; using namespace std; void f(int v, int...

Необходимо разобраться с конструктором! - C++
class Complex { public: // Конструктор по умолчанию // (в данном случае является также и конструктором преобразования) ...

Необходимо разобраться с кодом: указатели на Long - C++
Имеем программный код, который реализует блочный алгоритм шифрования - Tiny Encryption Algorithm или TEA. Если точнее то 2 функции по...

23
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,471
27.01.2012, 22:35  [ТС] #16
DU,именно должна эта ветка сработать, но не срабатывает!

Добавлено через 2 минуты
Да не, у меня именно mingw и
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
        #ifdef __MINGW32__
        puts("Defined");
        #endif
 getchar ();
}
Чё надо выводит, но толку сам понимаешь никакого
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 22:39 #17
kravam, HAVE_MODE_T определяется тут:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef PTW32_CONFIG_H
#  if defined(WINCE)
#    define NEED_ERRNO
#    define NEED_SEM
#  endif
#  if defined(__MINGW64__)
#    define HAVE_STRUCT_TIMESPEC
#    define HAVE_MODE_T
#  elif defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
#endif
таким образом вот это
C++
1
2
3
#ifndef HAVE_MODE_T
typedef unsigned int mode_t;
#endif
не определяется тут. что не ясно?
0
NoMasters
Псевдослучайный
1762 / 1105 / 73
Регистрация: 13.09.2011
Сообщений: 3,141
27.01.2012, 22:40 #18
kravam, всё происходит правильно. Выполняется ветка, определяющая, что у тебя уже должен быть определён mode_t. Из того самого sys/types.h, о котором писал retmas.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:45 #19
а как правильно переводится:
/*
* This is a duplicate of what is in the autoconf config.h,
* which is only used when building the pthread-win32 libraries.
*/
это копипаст, что и в config.h, который используется для сборки pthread-win32 библиотек.
К чему тут относится слово "который"? к копипасту или к config.h. Если второй вариант, то получается, что нужно как-то задействовать config.h
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,471
27.01.2012, 22:52  [ТС] #20
Хм, получается последняя директива такая: если
HAVE_MODE_T
неопределено, то следует определить mode_t
Так, mode_t не определяется.

Ладно, то есть мы всё делаем правильно и необходимо определить mode_t вручную или
подключить sys\types.h (что по-моему одно и то же)

А тогда возникает вопрос: смотри, препроцессор НАРОЧНО не определяет mode_t, а мы как
бы наперекор идём препроцессору; тебя не смущает это?

Выполняется ветка, определяющая, что у тебя уже должен быть определён
mode_t. Из того самого sys/types.h, о котором писал retmas.
ну может ты и прав,
но теперь осталось только вернуться к вопросу- а откуда было узнано о sys\types?

По-моему где-нибудь в комментах semaphore.h должна была быть строка
"подключите sys\types.h", тогда всё стало бы на свои места, но ведь такой строки нет!
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 23:00 #21
я уже писал, что semaphore.h не обязан определять mode_t (хотя это и не запрещено). а раз так, подключаем заголовок, где определен mode_t
1
NoMasters
Псевдослучайный
1762 / 1105 / 73
Регистрация: 13.09.2011
Сообщений: 3,141
27.01.2012, 23:00 #22
У меня нынче sys/types.h явно включается в semaphore.h... Но тем не менее в любом руководстве в исходниках присутствуют все нужные хидеры.
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 23:09 #23
раз компилятор не видит mode_t, значит тип не определен.
на основании строк
C++
1
2
3
#ifndef HAVE_MODE_T
typedef unsigned int mode_t;
#endif
делаем вывод, что макрос HAVE_MODE_T где-то выше все таки задефайнен. Т.к. нигде в этом файле выше больше нет попыток затайпдефить mode_t и нет других инклудов, значит mode_t должeн быть определен где-то за пределами semaphore.h. в другом файле. и этот другой файл должен включатся перед semaphore.h. т.е. имеем зависимость от порядка включения инклудов.

правда отсутствие других инклудов выше указанных строк я нарыл где-то в сети. самого файла semaphore.h у меня нет. так что везде это может быть по разному
1
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,471
27.01.2012, 23:09  [ТС] #24
Не ну я хочу сказать, что всё равно нехорошо как-то я первый раз столкнулся с таким, могли бы и так написать:
C++
1
//#include <sys\types.h>
всё вперёд...

Опять же, это хитрый хидер ибо находится не в инклудах, а не понять где... Узнаю линуксоидов- ты должен это знать потому, что ты должен это знать безусловно!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2012, 23:09
Привет! Вот еще темы с ответами:

Программа работы с директивами препроцессора - C++
Задать константы M и N и вычислить (aM + bN ) / MN Ввести два вещественных значения и вывести их синусы на экран

Необходимо разобраться с объектом типа fstream (конкретнее, с операторами << и >>) - C++
Нужно считать из текстового файла какое-то число и записать туда другое число: #include &lt;fstream&gt; using namespace std; int main...

Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться - C++
Друзья! Условимся, что компилятор g++ поддерживает этот стандарт, ибо ошибок, говорящих об обратном не замечено вроде. //main.cpp ...

программа с директивами процессора или с использованием функций printf и scanf - C++
1) Написать программу вычисления a+b с использованием #define. 2) Написать программу с использованием функций printf и scanf: ввести два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Yandex
Объявления
27.01.2012, 23:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru