Easyelectronics.ru

Электроника для всех
Текущее время: 22 апр 2019, 08:03

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: [Решено]#include заключенные в #if defined
СообщениеДобавлено: 16 авг 2017, 03:09 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
Добрый день!
Собираю кросплатформенный код. Qt 5.8.0\Qt 5.5.2.
Заключаю заголовочные файлы в #if defined(Q_OS_LINUX)
Код:
#if defined(Q_OS_LINUX)
  #include <sys/ioctl.h>
  #include <linux/types.h>
  #include <linux/spi/spidev.h>
#endif

и функцию, которая обращается к функциям описанным в заголовочных файлах.
Код:
bool DasysCore::ReadCoreData()
{

#if defined(Q_OS_LINUX)

  __DASYS_DATA dasysdata;

  int32_t  ret = 0;
  struct   spi_ioc_transfer xfer[2];
  unsigned char tx_buf[TX_LEN];
  unsigned char rx_buf[RX_LEN];


  memset(&xfer,   0, sizeof(xfer));
  memset(&tx_buf, 0, sizeof(tx_buf));
  memset(&rx_buf, 0, sizeof(rx_buf));

  tx_buf[0]  = 0x24;

  xfer[0].tx_buf = (unsigned long)tx_buf;
  xfer[0].len = 1;
  xfer[0].speed_hz = 5250000;

  xfer[1].rx_buf = (unsigned long)rx_buf;
  xfer[1].len = RX_LEN;
  xfer[1].speed_hz = 5250000;

  ret = ioctl(idSPI, SPI_IOC_MESSAGE(2), xfer);
  if (ret < 1)
    return false;

  memcpy(&rx_buf, &dasysdata, sizeof(rx_buf));
#endif

  return true;
}

На windows код ни должен генерировать ничего. Под linux компилятор не видит переменную struct spi_ioc_transfer xfer[2]; объявленную в #include <linux/spi/spidev.h>. Почему? GCC не обрабатывает препроцессор для заголовочных файлов?


Последний раз редактировалось __bl__ 16 авг 2017, 22:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #include заключенные в #if defined
СообщениеДобавлено: 16 авг 2017, 04:26 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3634
Откуда: КЧР, поселок Нижний Архыз
Сделать gcc -E, да глянуть.
А кто должен определять макрос Q_OS_LINUX?

И да, в linux/spi/spidev.h уже включается linux/types.h, так что отдельно его включать не надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #include заключенные в #if defined
СообщениеДобавлено: 16 авг 2017, 12:57 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
Eddy_Em писал(а):
... А кто должен определять макрос Q_OS_LINUX? ...

В файле qsystemdetection.h
Код:
// ...
#elif defined(__linux__) || defined(__linux)
#  define Q_OS_LINUX


#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINRT)
#  define Q_OS_WIN
#endif

#if defined(Q_OS_WIN)
#  undef Q_OS_UNIX
#elif !defined(Q_OS_UNIX)
#  define Q_OS_UNIX
#endif

// ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #include заключенные в #if defined
СообщениеДобавлено: 16 авг 2017, 13:41 
Старожил

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 219
Есть подозрение, что напутали с порядком включения заголовочных файлов. Т.е. файлы с проверкой:
Код:
#if defined(Q_OS_LINUX)
  #include <sys/ioctl.h>
  #include <linux/types.h>
  #include <linux/spi/spidev.h>
#endif

компилятором обрабатываются раньше, чем файл с "дефайном".
Обычно такие макросы определяют при помощи аргументов командной строки, вызывающей компилятор. Тогда гарантированно макрос будет определён до начала проверок типа '#if defined'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [Решено]#include заключенные в #if defined
СообщениеДобавлено: 16 авг 2017, 22:22 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 754
Откуда: Украина, Харьков
Решено. Перед #include заключенные в #if defined вставил #include "qsystemdetection.h", в которой объявлялся дефайн. Получилось так
Код:
#include "qsystemdetection.h"

#if defined(Q_OS_LINUX)
  #include <sys/ioctl.h>
  #include <linux/spi/spidev.h>
#endif


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB