Странное объявление функции файла заголовка C ++ - PullRequest
0 голосов
/ 17 мая 2019

Я читаю некоторый исходный код, который я пытаюсь скомпилировать в привязки Python, когда я пытаюсь swig -c++ -python my_interface.i я получаю странную ошибку.

Я знаю, что исходный код написан на C ++ 11.

// module.hpp
#pragma once

namespace module
{
    MODULE_API void getVersion (unsigned &params);
}
// my_interface.i
%module my_api
%{
#include "module.hpp"
%}

%include "module.hpp"

У меня нет доступа к исходным файлам, только к заголовкам и общей библиотеке, которую мы можем назвать modulelib.so.

Кто-нибудь знает, что означает MODULE_API перед возвращаемым типом функции?

Когда я пытаюсь скомпилировать прямо сейчас, я получаю ошибку module.hpp:29: Error: Syntax error in input(1) Когда я удаляю MODULE_API, вывод переходит к следующему объявлению функции, потому что у них у всех такой стиль объявления, я бы удалил их все, но я чувствую, что это что-то сломает.

Прямо сейчас, когда я запускаю swig -v -wall -c++ -python my_interface.i Я получаю сообщение об ошибке:

Language subdirectory: python
Search paths:
   ./
   ./swig_lib/python/
   /usr/share/swig3.0/python/
   ./swig_lib/
   /usr/share/swig3.0/
Preprocessing...
Starting language-specific parse...
module.hpp:6: Error: Syntax error in input(1).

1 Ответ

2 голосов
/ 17 мая 2019

Это общий шаблон для обработки видимости символов. Например, Windows требует, чтобы вы определяли функции с помощью __declspec(dllexport), когда компилирует библиотеку (так что компоновщик знает, как сделать соответствующие символы внешне видимыми), и __declspec(dllimport), когда использует / linking библиотека (так что компоновщик знает, что эти символы должны быть импортированы из DLL).

Чтобы избежать необходимости иметь два разных заголовка (один для компиляции, один для использования библиотеки), используются условные определения:

#ifdef WIN32

  #ifdef MODULE_EXPORTS
    #define MODULE_API __declspec(dllexport)
  #else
    #define MODULE_API __declspec(dllimport)
  #endif

#else
  #define MODULE_API
#endif

Это всего лишь пример. не имеет , чтобы быть MODULE_API вообще. В некоторых проектах используются __attribute__((visibility("default"))) и __attribute__((visibility("hidden"))) GCC, но именно в Windows появилась эта схема, поскольку по умолчанию для Windows означает скрыть символов.

...