警告(Anachronism):将void(*)(int)赋给外部“C” void(*)(int) [英] Warning (Anachronism): Assigning void(*)(int) to extern "C" void(*)(int)

查看:299
本文介绍了警告(Anachronism):将void(*)(int)赋给外部“C” void(*)(int)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用Sun的C ++编译器时遇到问题。我已阅读了Oracle的使用指针到函数[从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,第24行:警告(Anachronism):将void(*)(int)赋给externCvoid(*)(int)。
test.cxx,line 58:其中:虽然实例化SignalHandler< 5,0>> :: SignalHandler(void(*)(int),int)。
test.cxx,第58行:其中:从非模板代码实例化。

SunCC 5.12 b
$ b

  $ /opt/solarisstudio12.3/bin/CC test.cxx 
test.cxx,第24行:警告(Anachronism) :将void(*)(int)赋给externCvoid(*)(int)。
test.cxx,line 58:其中:虽然实例化SignalHandler< 5,0>> :: SignalHandler(void(*)(int),int)。
test.cxx,第58行:其中:从非模板代码实例化。



SunCC 5.13 b
$ b

  $ /opt/solarisstudio12.4/bin/CC test.cxx 
test.cxx,第24行:警告(Anachronism) :使用void(*)(int)初始化externCvoid(*)(int)。
test.cxx,line 58:其中:虽然实例化SignalHandler< 5,0>> :: SignalHandler(void(*)(int),int)。
test.cxx,第58行:其中:从非模板代码实例化。

b
$ b

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

它不完全清楚我的问题是什么。这里是Oracle板上的类似问题,但OP基本上告诉RTFM: Sun Studio 11警告(Anachronism )



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






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

externC{
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; //失败

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:
//不可复制
SignalHandler const SignalHandler&);
void operator =(const SignalHandler&);
};

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


解决方案

您可以更改SignalHandler :: NullHandler到一个常规的C函数(让我们把它命名为SignalHandler_NullHandler)。
然后在externC中包装SignalHandler_NullHandler和SignalHandlerFn。



BTW。这是我的猜测如何对齐这两个函数,但你已经解释了更好的在你的评论中,有一个C / C ++铸造的问题。


I'm having trouble with Sun's C++ compiler. I've read Oracle's Working with Pointers to Functions [from C++]. Its a good read, and I get the impression SunCC is most compliant among all the compilers in this area (though its causing me trouble).

The test code is below, and line 24 is new_handler.sa_handler = (pfn ? pfn : &SignalHandler::NullHandler);. Unrolling the ternary operator shows this is the issue: 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
$

Its not exactly clear to me what the problem is. Here's a similar issue on the Oracle boards, but the OP is basically told to RTFM: Sun Studio 11 "Warning (Anachronism)".

How do I resolve the anachronistic warning?


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;
}

解决方案

You may change SignalHandler::NullHandler to a regular C function (let's name it SignalHandler_NullHandler). Then wrap both SignalHandler_NullHandler and SignalHandlerFn in extern „C".

BTW. It was my guess how to „align" these two functions but you have explained it better in your comment that there is a problem with C/C++ casting.

这篇关于警告(Anachronism):将void(*)(int)赋给外部“C” void(*)(int)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆