Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,695

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

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

Author24 — интернет-сервис помощи студентам
Друзья! Боюсь, что без предисловий не обойтись. Постараюсь, чтобы они были короткими. Поехали:
Часть кода:
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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.01.2012, 20:51
Ответы с готовыми решениями:

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

Директивы условной компиляции
На сколько часто вы используете директивы условной компиляции? Есть ли преимущества их использования?

Аналог условной компиляции Q_OS_XXX
Есть код на плюсах: #ifdef Q_OS_LINUX pos_= this-&gt;geometry().topLeft(); #endif Как это можно провернуть в питоне? Т.е имею...

23
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
27.01.2012, 21:28
Цитата Сообщение от kravam Посмотреть сообщение
__MINGW32__; а как правильно её определить?
Этот макрос определяет сам mingw32
Цитата Сообщение от kravam Посмотреть сообщение
#ifndef PTW32_CONFIG_H
Там же написано в комментарии, что при сборке библиотеки pthread всё внутри уже определено в другом месте, где этот макрос и задается.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 21:29
C++ Скопировано
1
#include <sys/types.h>
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
27.01.2012, 21:34
C Скопировано
1
#undef HAVE_MODE_T
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,695
27.01.2012, 21:55  [ТС]
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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 22:01
не смотри на конкретные реализации. маны - вот твой источник инфы.
semaphore.h не обязан хоть как то (явно или косвенно) определять, что такое mode_t

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

Добавлено через 2 минуты
NoMasters, я не понимаю, у нас есть возможность разобраться, так почему бы не разобраться? Я хочу разобраться, а не обманывать проепроцессор. Кстати раньше я всегда так и делал, если чё-то было неопределено или определено условно, я просто рядышком писал безусловное определение и всё, а теперь хочу понять как надо сделать правильно.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
27.01.2012, 22:09
kravam, чего ты не понимаешь? Ты тот кусок кода собрал? Строку выводит?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 22:10
ну и что, что windows. ты ж используешь реализации posix ф-ий (или я не прав?). а маны и в сети есть. про __MINGW*__ тебе уже ответили - определена всегда, когда используешь соответствующую mingw сборку
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:20
может перед ключением sepaphore.h стоит включить файл, в котором задефайнен PTW32_CONFIG_H.
Гугл ссылается на некий config.h. Может где-то в другом месте есть дефайн.
т.е. чтобы собиралось может оказаться выжным порядок включения инклудов

C++ Скопировано
1
2
#include <config.h> // макросы, которые тут определены будут выдны везде ниже.
#include <semaphore.h>
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
27.01.2012, 22:23
Цитата Сообщение от 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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 22:25
PTW32_CONFIG_H не надо нигде определять. он определен при сборке win pthreads. иначе он не определен и не должен быть определен
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,695
27.01.2012, 22:29  [ТС]
Цитата Сообщение от 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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:32
ну т.е. при сборке в 32битной винде должна срабатывать ветка.
C++ Скопировано
1
2
3
#  elif defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
раз не мингв сборка, значит должны пройти в дефайн HAVE_MODE_T из-за наличия _UWIN. что такое _UWIN и в каких случаях он определен?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,695
27.01.2012, 22:35  [ТС]
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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 22:39
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
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
27.01.2012, 22:40
kravam, всё происходит правильно. Выполняется ветка, определяющая, что у тебя уже должен быть определён mode_t. Из того самого sys/types.h, о котором писал retmas.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.01.2012, 22:45
а как правильно переводится:
/*
* 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,695
27.01.2012, 22:52  [ТС]
Хм, получается последняя директива такая: если
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2012, 22:52
Помогаю со студенческими работами здесь

Применение директив условной компиляции
Здравствуйте ! Подскажите пожалуйста, для чего в этой программе используются директивы условной компиляции, программа рабочая ...

arduino ошибка условной компиляции в NewLiquidCrystal
добрый день есть некий 100% рабочий проект на &quot;ардуине&quot; используется &quot;стандартный&quot; 16х2 LCD дисплей (в 4х битном режиме) ...

[РЕШЕНО] Директивы условной компиляции в AVRSTUDIO4
Коллеги доброго времени суток! Помогите разобраться с директивами условной компиляции в AVRSTUDIO4, а именно с областью видимости...

Какие директивы условной компиляции Вы знаете?
2. Какие директивы условной компиляции Вы знаете?

Символ условной компиляции для конфигурации Trial
Создал Конфигурацию для проекта Trial В Проект &gt; Копиляция &gt; Символа условной компиляции для конфигурации Trial Пишу Но в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер