SunのC++コンパイラに問題があります。私はオラクルのWorking with Pointers to Functions [from C++]を読んだ。その良い読書と、私はSunCCがこの分野のすべてのコンパイラの中で最も遵守しているという印象を受けました。警告(時代遅れ):extern "C" void(*)(int)にvoid(*)を割り当てる
テストコードは次のとおりで、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;
}
NullHandlerの署名とは何ですか? – kfsone
@kfsone - サンプルの下端。インライン定義は 'static void NullHandler(int/* unused * /){}'です。私は三項演算子もアンロールしました。問題は 'new_handler.sa_handler = pfn;'です。 – jww
extern "C"である必要はありませんか? – kfsone