我在使用Sun的C++编译器时遇到麻烦。我读过甲骨文的使用指向函数的指针(来自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
$我不太清楚是什么问题。甲骨文板上也有类似的问题,但OP基本上被告知RTFM:Sun Studio 11“警告(不合时宜)”。
我该如何解决这个不合时宜的警告?
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;
}发布于 2016-09-19 17:43:46
您可以将SignalHandler::NullHandler更改为常规C函数(让我们将其命名为SignalHandler_NullHandler)。然后将SignalHandler_NullHandler和SignalHandlerFn都用“C”外接。
顺便说一下。我猜想如何对这两个函数“对齐”,但是您在评论中更好地解释了C/C++转换存在一个问题。
https://stackoverflow.com/questions/39562034
复制相似问题