首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警告(不合时宜):将void(*)(int)赋值给"C“空(*)(Int)

警告(不合时宜):将void(*)(int)赋值给"C“空(*)(Int)
EN

Stack Overflow用户
提问于 2016-09-18 19:54:19
回答 1查看 632关注 0票数 2

我在使用Sun的C++编译器时遇到麻烦。我读过甲骨文的使用指向函数的指针(来自C++)。这是一个很好的阅读,我觉得SunCC在这方面的所有编译器中都是最兼容的(尽管它给我带来麻烦)。

测试代码在下面,第24行是new_handler.sa_handler = (pfn ? pfn : &SignalHandler::NullHandler);。展开三元操作符显示这就是问题:new_handler.sa_handler = pfn;

SunCC 5.11

代码语言:javascript
运行
复制
$ /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

代码语言:javascript
运行
复制
$ /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

代码语言:javascript
运行
复制
$ /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

代码语言:javascript
运行
复制
$ /opt/developerstudio12.5/bin/CC test.cxx
$

我不太清楚是什么问题。甲骨文板上也有类似的问题,但OP基本上被告知RTFM:Sun Studio 11“警告(不合时宜)”

我该如何解决这个不合时宜的警告?

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-19 17:43:46

您可以将SignalHandler::NullHandler更改为常规C函数(让我们将其命名为SignalHandler_NullHandler)。然后将SignalHandler_NullHandler和SignalHandlerFn都用“C”外接。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39562034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档