相关疑难解决方法(0)

如何弃用 C++ 标头?

我想弃用 C++ 头文件,以便如果有人在他们的代码中包含它,编译器会发出警告。

我知道我可以弃用单个符号,例如,使用 C++14 [[deprecated]],但是标题是否有类似的东西?也许有什么巧妙的伎俩?

请注意,即使用户不使用标题中的任何内容,我也希望编译器发出警告。

c++ deprecated

33
推荐指数
5
解决办法
3439
查看次数

我可以让C++预处理器在编译期间发送输出吗?

我一直在调试一个特别阴险的错误,我现在认为这是由于包含(或不包含)不同标头时的不同行为引起的意外更改引起的.

这不完全是我的代码结构,但让我们来看看这个场景:

#include "Newly_created_header_which_accidentally_undefines_SOME_DEFINE.h"

// ...

#ifdef SOME_DEFINE
    code_which_i_believe_i_am_always_running();
#else 
    code_which_fails_which_i_have_forgotten_about(); // runtime error stack traces back here, but I don't know this... or maybe it's some strange linker error
#endif
Run Code Online (Sandbox Code Playgroud)

我搜索了我的git提交并缩小了bug的原因,无数次地编译和运行我的代码,只是在几个小时之后发现导致bug的唯一区别是包含看起来完全是良性的不相关的标题.

也许这是一个很好的论据,为什么预处理器基本上只是糟透了.

但我喜欢它.预处理器很酷,因为它可以让我们制作快捷方式.只是这些快捷方式中的一些,如果不小心使用,会让我们陷入困境.

所以在这个时刻,如果我可以使用一个指令#echo "Running old crashy code",这将有助于我在编译期间能够看到这一点,所以我可以立即提示我开始调查为什么没有定义SOME_DEFINE.

据我所知,确定SOME_DEFINE是否定义的直接方法是做类似的事情

#ifndef SOME_DEFINE
    printf("SOME_DEFINE not defined!!\n");
Run Code Online (Sandbox Code Playgroud)

这肯定会完成工作,但没有充分的理由在运行时执行此任务,因为它完全在编译时确定.这只是我想在编译时看到的东西.

话虽这么说,在这种情况下,使用打印(或记录或甚至抛出异常)可能是可以接受的事情,因为我不会真正关心减慢或混乱可疑代码.但是,如果我有两个代码路径,这两个代码路径都很重要,那就不适用了.我只想在编译时知道哪一个被激活.我不得不担心在程序开始时运行执行预处理器条件打印的代码.

这实际上只是一个冗长的方式来问一个问题,"我可以使用预处理器指令在编译期间将字符串回显到输出吗?"

c++ c-preprocessor

19
推荐指数
2
解决办法
1万
查看次数

有模板调试器吗?

模板本身可以是程序.

是否有模板调试器,以便您可以逐步执行模板的"执行"?

这基本上必须是在compile/link/codegen期间完成的事情 - 并且不同于调试生成的程序.

即使在许多不能使用调试器的"原始"环境中,通常也可以进行"printf调试".甚至可以使用模板吗?

编辑:另一种思考方式就像C预处理器.生成"预处理"源代码(编译器实际编译的预处理器输出)通常非常有用 - 这可以让您了解宏的效果.等效的模板会很棒 - 让编译器输出非模板源代码,该源代码与模板化输入相对应.我认为最接近的是C++到C的翻译器.(那个comeau编译器不这样做吗?)

c++ template-meta-programming

11
推荐指数
1
解决办法
428
查看次数

5
推荐指数
1
解决办法
5118
查看次数