考虑以下代码:
namespace foo {}
class A
{
class B
{
};
friend int foo::bar( B& );
};
namespace foo
{
int bar( A::B& )
{
}
}
Run Code Online (Sandbox Code Playgroud)
G ++ 4.4.3告诉我:
friendfun-innerclass.cpp:21:错误:'int foo :: bar(A :: B&)'应该在'foo'中声明
但我无法宣布:
namespace foo
{
int bar( A::B& );
}
Run Code Online (Sandbox Code Playgroud)
在A类定义之前因为A :: B尚未声明.而且我不能明确声明"A类:: B",声明类BI必须给出类A的定义,据我所知,"朋友"声明必须在A类的定义中.
对我来说很奇怪的是,如果我从命名空间foo中取出函数"bar()",一切正常.对我来说似乎违反直觉的是,在命名空间内部或不在命名空间内部使用函数会改变编译器是否接受类中的友元函数声明.
有没有人知道如何通过这种方式来构建所有声明并使其发挥作用?
我必须处理一个可以从大型项目中的各个地方调用的日志记录模块。我遇到的问题是,有时可能会从信号处理程序内执行的代码中调用该模块。通常,日志模块使用 localtime() 和 strftime() 包含时间数据,但当然这些调用不是异步信号安全的,如果从信号处理程序中调用,可能会导致死锁。有没有办法(在 GNU/Linux 系统上)判断我的代码当前是否在信号处理程序上下文中执行,除了例如让每个信号处理程序在处理时设置一个标志?我认为简化我们的信号处理程序会更好,但在这种情况下,我无法选择在哪里调用日志记录模块。