SIGINT 未在此范围内声明

SIGINT was not declared in this scope

背景

我正在尝试在 Raspberry 3 上为 Rasbian 运行 构建示例 REST api 应用程序。我使用了 cpprestsdk

示例包含以下头文件:

#include <condition_variable>
#include <mutex>
#include <iostream>

static std::condition_variable _condition;
static std::mutex _mutex;

namespace cfx {
    class InterruptHandler {
    public:
        static void hookSIGINT() {
            signal(SIGINT, handleUserInterrupt);        
        }

        static void handleUserInterrupt(int signal){
            if (signal == SIGINT) {
                std::cout << "SIGINT trapped ..." << '\n';
                _condition.notify_one();
            }
        }

        static void waitForUserInterrupt() {
            std::unique_lock<std::mutex> lock { _mutex };
            _condition.wait(lock);
            std::cout << "user has signaled to interrup program..." << '\n';
            lock.unlock();
        }
    };
}

问题

在 MacOS 上编译时,没有出现问题。

然而,当在 rasbian 中编译时,我得到 error: 'SIGINT' was not declared in this scope 错误。

很明显 SIGINT 定义 - #define SIGINT 2 或类似的 - 在 rasbian 上编译时无法访问。

问题

为什么我在 rasbian 上出现此错误,但在 macOS 上却没有?是编译器找不到signal.h吗?

我确保 CMakeLists.txt 中的 include_directories 包含所需的包含路径。

更新

手动添加 #include <csignal>.

时的错误已解决

您还没有包含 signal.h。

您包含了一些 C++ 标准库 headers,作为对 MacOS 的副作用,这些库恰好包含 signal.h。但是,未指定会发生这种情况,因此您不能依赖它在 headers.

的不同实现中工作

尝试添加:

#include <signal.h>

在顶部。

在 Linux 上,要包含的头文件是

#include <signal.h>

在 Mac 上OS 要包含的等效头文件是

#include <csignal.h>

根据您的 OS,头文件总是会改变。不过他们应该做同样的事情