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

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

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

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

27.01.2012, 20:51. Просмотров 1845. Ответов 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 функции по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
27.01.2012, 21:28 #2
Цитата Сообщение от kravam Посмотреть сообщение
__MINGW32__; а как правильно её определить?
Этот макрос определяет сам mingw32
Цитата Сообщение от kravam Посмотреть сообщение
#ifndef PTW32_CONFIG_H
Там же написано в комментарии, что при сборке библиотеки pthread всё внутри уже определено в другом месте, где этот макрос и задается.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 21:29 #3
C++
1
#include <sys/types.h>
1
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.01.2012, 21:34 #4
C
1
#undef HAVE_MODE_T
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.01.2012, 21:55  [ТС] #5
retmas, а как определил? Мне чтобы знать на будующее

Добавлено через 14 минут
...А вообще, retmas, это как-то не того... Я увидел
C++
1
2
3
4
5
6
7
#ifndef _MODE_T_
#define    _MODE_T_
typedef unsigned short _mode_t;
 
#ifndef    _NO_OLDNAMES
typedef _mode_t    mode_t;
#endif
Ну ты понимаешь, я бы и сам мог также написать, но я же тебе говорю, в файле semaphore написано, что mode_t может быть определён только в случае если опредеолена
__MINGW32__

А тут получается, mode_t определяется безусловно. ОНо, конечно, компильнётся, но моя
цельь была не столь компиляция, сколько разобраться с директивами, да вот хотя бы с
той же

__MINGW32__

Она ведь не определена нигде! Так как сделать, чтобы она была определена?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 22:01 #6
не смотри на конкретные реализации. маны - вот твой источник инфы.
semaphore.h не обязан хоть как то (явно или косвенно) определять, что такое mode_t

Добавлено через 1 минуту
кстати semaphore.h - думаю не последний заголовок, где ты столкнешься с подобным
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
27.01.2012, 22:01 #7
kravam, попробуй собрать
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    #ifdef __MINGW32__
    puts("Defined");
    #endif
}
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.01.2012, 22:07  [ТС] #8
retmas, у меня windows, вопрос остался

Добавлено через 2 минуты
NoMasters, я не понимаю, у нас есть возможность разобраться, так почему бы не разобраться? Я хочу разобраться, а не обманывать проепроцессор. Кстати раньше я всегда так и делал, если чё-то было неопределено или определено условно, я просто рядышком писал безусловное определение и всё, а теперь хочу понять как надо сделать правильно.
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
27.01.2012, 22:09 #9
kravam, чего ты не понимаешь? Ты тот кусок кода собрал? Строку выводит?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 22:10 #10
ну и что, что windows. ты ж используешь реализации posix ф-ий (или я не прав?). а маны и в сети есть. про __MINGW*__ тебе уже ответили - определена всегда, когда используешь соответствующую mingw сборку
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:20 #11
может перед ключением sepaphore.h стоит включить файл, в котором задефайнен PTW32_CONFIG_H.
Гугл ссылается на некий config.h. Может где-то в другом месте есть дефайн.
т.е. чтобы собиралось может оказаться выжным порядок включения инклудов

C++
1
2
#include <config.h> // макросы, которые тут определены будут выдны везде ниже.
#include <semaphore.h>
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
27.01.2012, 22:23 #12
Цитата Сообщение от DU Посмотреть сообщение
sepaphore.h стоит включить файл, в котором задефайнен PTW32_CONFIG_H.
Не надо так делать.
Цитата Сообщение от kravam Посмотреть сообщение
/* * This is a duplicate of what is in the autoconf config.h, * which is only used when building the pthread-win32 libraries. */
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
27.01.2012, 22:25 #13
PTW32_CONFIG_H не надо нигде определять. он определен при сборке win pthreads. иначе он не определен и не должен быть определен
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.01.2012, 22:29  [ТС] #14
Цитата Сообщение от NoMasters Посмотреть сообщение
kravam, чего ты не понимаешь? Ты тот кусок кода собрал? Строку выводит?
выводит

Да вы чё прицепились к этой __MINGW32__?, речь идёт о цепочке определений (и если уж рассматривать эти макросы по отдельности, тогда уж надоначинать с HAVE_MODE_T, ибо он В КОНЕЧНОМ ИТОГЕ определяет, будет определён тим mode_t или нет)

1) Сперва препроцессор смотрит, определена ли PTW32_CONFIG_H
C++
1
#ifndef PTW32_CONFIG_H
2) Потом препроцессор смотрит определена ли __MINGW32__ или _UWIN
C++
1
#  elif defined(_UWIN) || defined(__MINGW32__)
3) Потом препроцессор смотрит определена ли HAVE_MODE_T
C++
1
#    define HAVE_MODE_T
И если все эти три пункта выполняются, препроцесоор определяет mode_t

И слава Богу у меня это всё под рукой оказалось я могу всё это выяснить, а дальше не могу. Размышляю так:
1) Коль скоро mode_t неопрелделено значит, неопределено и HAVE_MODE_T
2) Коль скоро HAVE_MODE_T неопределено, неопределено и __MINGW32__
3) Коль скоро __MINGW32__ неопределено, неопределено и PTW32_CONFIG_H (retmas, где я неправильно рассуждаю?)

Всё, выводы закончились. Что значит "Неопределено PTW32_CONFIG_H", я не знаю. Может, мне подключить что надо, может прописать что надо.

К советам: напиши
C++
1
#define PTW32_CONFIG_H
Отошусь скептически, ибо такой совет я и сам могу дать.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:32 #15
ну т.е. при сборке в 32битной винде должна срабатывать ветка.
C++
1
2
3
#  elif defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
раз не мингв сборка, значит должны пройти в дефайн HAVE_MODE_T из-за наличия _UWIN. что такое _UWIN и в каких случаях он определен?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2012, 22:32
Привет! Вот еще темы с ответами:

Программа работы с директивами препроцессора - 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: ввести два...


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

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

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