如何在main()之前创建特定类的实例,早于任何其他实例(包括静态和全局变量,包括静态和动态库(包括第三方提供的库))?
我正在处理一个具有许多类的项目,这些类在构造期间可能会导致错误,例如访问NULL指针.任何此类错误都会导致信号发送到应用程序.我有一个信号处理程序捕获信号,显示违规线程的堆栈跟踪,并调用默认信号处理程序,导致生成核心转储等.
但是,一些此类错误导致的实例被创建为全局变量和类的静态变量.即它们被构造并导致比main()更早的信号输入.
为了捕获这样的信号,我需要在main()之前注册我的信号处理程序,即我需要创建一个实例(它将注册信号处理程序)也作为全局或类静态变量,我需要保证这样早于任何其他实例创建/构造实例.
怎么做到这一点?
要注册信号处理程序,我使用sigaction().
为了显示堆栈跟踪,我使用了backtrace(),backtrace_symbols(),abi :: __ cxa_demangle().
对于目前已有的测试框架我需要通过(第一最呼叫期间)的功能片段的行号函数的内部.像这样的东西:
#include <stdio.h>
void func(int line_num)
{
#define LINE_NUM (__LINE__ + 1)
if(line_num == __LINE__) // Check the passed arg against the current line.
printf("OK");
else
printf("FAIL");
}
int main(void)
{
func(LINE_NUM); // Pass to the func the line number inside of that func.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(这是更复杂功能的简约版本).
因为示例代码打印"FAIL".
如果我传递绝对值5
,例如func(5)
然后它打印"OK".我不喜欢绝对值,5
因为如果我在func
定义前添加一行,那么绝对值将需要更正.
而不是#define LINE_NUM (__LINE__ + 1)
我也尝试了以下内容:
1.
#define VALUE_OF(x) x
#define LINE_NUM (VALUE_OF(__LINE__) + 1)
Run Code Online (Sandbox Code Playgroud)
2.
#define VAL(a,x) a##x …
Run Code Online (Sandbox Code Playgroud) 双击 Jupyter Notebook 中的单元格即可进入该单元格的编辑模式。
如何恢复此操作?如何退出编辑模式?
在 C11 [C11_N1570]和 C17 [C17_N2176]的最新草案中,我找不到以下内容的证明(我相信这是众所周知的):
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
有人可以向我推荐特定部分吗?
我知道C++11 的这个回复。回复的第二部分讨论了C,但只涉及了values的范围。它并不能证明字体大小之间的比例。
如果该类型是泛型类型参数,如何创建零大小类型的实例?
(!) 我对“The Rustonomicon”9.10 提供的答案不感兴趣。处理零大小类型、片段Some(ptr::read(NonNull::<T>::dangling().as_ptr()))
。
例如
fn get<T>() -> Option<T>
if size_of::<T>() == 0 { // If the type parameter T is a zero-sized type
return Some< ??? > // then return the instance of that type.
// Otherwise return something different.
Run Code Online (Sandbox Code Playgroud)
???
我可以在上面的代码中放置什么来代替?
理想情况下,我希望此代码适用于作为 传递的任何零大小类型T
,
Default
struct Zst;
, struct Zst{}
),()
)enum Zst;
, enum Zst { TheOnlyValue } …