c++ - 警告(不合时宜): Assigning void(*)(int) to extern "C" void(*)(int)

标签 c++ function-pointers solaris linkage sunstudio

我在使用 Sun 的 C++ 编译器时遇到问题。我读过 Oracle 的 Working with Pointers to Functions [from C++] 。这是一本很好的读物,我的印象是 SunCC 是该领域所有编译器中最合规的(尽管它给我带来了麻烦)。

测试代码如下,第24行为new_handler.sa_handler = (pfn ? pfn : &SignalHandler::NullHandler);。展开三元运算符表明这就是问题所在:new_handler.sa_handler = pfn;

SunCC 5.11

$ /opt/solstudio12.2/bin/CC test.cxx
"test.cxx", line 24: Warning (Anachronism): Assigning void(*)(int) to extern "C" void(*)(int).
"test.cxx", line 58:     Where: While instantiating "SignalHandler<5, 0>::SignalHandler(void(*)(int), int)".
"test.cxx", line 58:     Where: Instantiated from non-template code.

SunCC 5.12

$ /opt/solarisstudio12.3/bin/CC test.cxx
"test.cxx", line 24: Warning (Anachronism): Assigning void(*)(int) to extern "C" void(*)(int).
"test.cxx", line 58:     Where: While instantiating "SignalHandler<5, 0>::SignalHandler(void(*)(int), int)".
"test.cxx", line 58:     Where: Instantiated from non-template code.

SunCC 5.13

$ /opt/solarisstudio12.4/bin/CC test.cxx
"test.cxx", line 24: Warning (Anachronism): Using void(*)(int) to initialize extern "C" void(*)(int).
"test.cxx", line 58:     Where: While instantiating "SignalHandler<5, 0>::SignalHandler(void(*)(int), int)".
"test.cxx", line 58:     Where: Instantiated from non-template code.

SunCC 5.14

$ /opt/developerstudio12.5/bin/CC test.cxx
$

我不太清楚问题是什么。 Oracle 板上有一个类似的问题,但 OP 基本上是告诉 RTFM:Sun Studio 11 "Warning (Anachronism)" .

如何解决不合时宜的警告?


solaris:~$ cat test.cxx
#include <signal.h>

extern "C" {
  typedef void (*SignalHandlerFn) (int);
};

template <int S, bool O=false>
struct SignalHandler
{
  SignalHandler(SignalHandlerFn pfn = NULL, int flags = 0) : m_installed(false)
  {
    struct sigaction new_handler;

    do
    {
      int ret = 0;

      ret = sigaction (S, 0, &m_old);
      if (ret != 0) break; // Failed

      if (m_old.sa_handler != 0 && !O) break;

      new_handler.sa_handler = (pfn ? pfn : &SignalHandler::NullHandler);
      new_handler.sa_flags = (pfn ? flags : 0);

      ret = sigemptyset (&new_handler.sa_mask);
      if (ret != 0) break; // Failed

      ret = sigaction (S, &new_handler, 0);
      if (ret != 0) break; // Failed

      m_installed = true;

    } while(0);
  }

  ~SignalHandler()
  {
    if (m_installed)
      sigaction (S, &m_old, 0);
  }

private:
  struct sigaction m_old;
  bool m_installed;

  static void NullHandler(int /*unused*/) { /* continue*/ }

private:
  // Not copyable
  SignalHandler(const SignalHandler &);
  void operator=(const SignalHandler &);
};

int main(int argc, char* argv[])
{
  SignalHandler<SIGTRAP, 0> handler;
  return 0;
}

最佳答案

您可以将 SignalHandler::NullHandler 更改为常规 C 函数(我们将其命名为 SignalHandler_NullHandler)。 然后将 SignalHandler_NullHandler 和 SignalHandlerFn 包装在 extern“C”中。

顺便说一句。我猜测如何“对齐”这两个函数,但您在评论中更好地解释了 C/C++ 转换存在问题。

关于c++ - 警告(不合时宜): Assigning void(*)(int) to extern "C" void(*)(int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562034/

相关文章:

linux - 按字段排序 UNIX

c++ - 包含成员函数名称为errno和cerrno时的g++ 7编译错误

c++ - 使用 C++ 设置进程核心配额

c++ - 备用函数语法/函数原型(prototype)?

c++ - 函数指针是否不支持 C++ 中的实例类型

java - 没有创建 hs_err_pid.log 文件,也没有从 Solaris 上的 jvm 转储核心

c++ - 从 constexpr 数组获取 constexpr 属性时遇到困难

c++ - 在 C++ 头文件中使用第三方类

c - 用于使用指向结构的指针循环结构成员

当同一个套接字上的发送/接收正在进行时,套接字是否可以从另一个线程关闭?