C ++ Boost :: thread, вызывающий функцию c - обнаружение ошибки компиляции - PullRequest
0 голосов
/ 07 мая 2020

Приходится вызывать функцию C stati c как часть моей функции рабочего потока boost. C stati c работает как часть другого кода C ++, однако она не может скомпилироваться, будучи частью функция рабочего потока.

Ниже приводится список заголовков, включенных в мой файл заголовка C ++.

#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/asio/io_service.hpp>
#include <string>
#include <queue>

и c заголовок кода начинается следующим образом:

    #ifdef __cplusplus
    extern "C" {
    #endif

    #if defined(MS_WINNT) || defined(WIN32)

    #include <windows.h>
    typedef BSTR     ARG;

У меня нет контроля над кодом C, но я контролирую код C ++, который я вызываю.

Сообщение об ошибке, которое у меня возникает, выглядит следующим образом:

ошибка C2146: синтаксическая ошибка: отсутствует ';'

Однако, если я поменяю порядок включаемых файлов, я получаю другое сообщение об ошибке.

ошибка C1189: #error: WinSock.h уже включен

Использование Visual Studio 2010 с библиотеками boost 1.62 . Можно ли компилировать и запускать подобные вещи?

Добавление основной части кода C ++.

#ifndef  _THREADS
#define  _THREADS
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/asio/io_service.hpp>
#include <string>
#include <queue>

namespace testThreads
{


    class boostthreads
    {
            boost::asio::io_service _io_service;
            boost::asio::io_service::work _work;
            boost::thread_group _Threads;
            std::queue<std::string> _queueOfRequests;
            boost::mutex _mutex;

            void handleCurrentRequest();
            unsigned long getThreadId ( std::string& currentThreadIdA);


    public:
            boostthreads();
            ~boostthreads();
    };

}
#endif

1 Ответ

1 голос
/ 07 мая 2020

Во время обсуждения в комментариях к сообщениям мы обнаружили, что произошла ошибка C2146, потому что в заголовке C требуется определение BSTR typedef. Включение Windows .h перед заголовком C приводит к конфликту из-за двойного включения WinSock.h как Windows .h, так и boost / asio.hpp. Однако BSTR - единственное, что требуется вашей библиотеке от Windows .h, поэтому решение состоит в том, чтобы включить только заголовок, в котором определен BSTR. Это заголовок WTypes.h. Просто к сведению, BSTR в Microsoft docs: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/automat/bstr

...