我们继承了一个非常卷积的项目(500kloc)和许多预处理器条件逻辑,其中大部分不再相关,我想要清理它.
我是否可以使用预处理器¹仅扩展某些条件逻辑,并将所有其他预处理器宏,定义和包含在输出中?
¹在这里,通过"预处理器",我的意思是"任何工具",标准C预处理器,我可以安装的东西,甚至是黑客攻击的Perl或Python脚本.
例如,假设我们有这组代码:
#include <foo>
#define baz
#define bar(a) do{(a)+1} \
while(0)
#ifdef X
#if Y > 20
#if Z > 5
so_far_so_good = true;
#endif
#ifdef baz
something();
#endif
#else
otherthing();
#endif
#else
#if Z > 10
wow().this.is.bad;
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
我想要的工具(如果它不存在则可能需要编写)将是CPP的一个版本,它不仅接受特定调用的定义列表,而且还接受在扩展期间要遵守的定义列表.任何不在第二个列表中的预处理程序符号都是完全不管的.一个例子是按顺序:
cpptreadlight -DY=22 --only=Y
Run Code Online (Sandbox Code Playgroud)
会产生:
#include <foo>
#define baz
#define bar(a) do{(a)+1} \
while(0)
#ifdef X
#if Z > 5
so_far_so_good = true;
#endif
#ifdef baz
something();
#endif
#else
#if Z > 10
wow().this.is.bad; …Run Code Online (Sandbox Code Playgroud) 根据std::weak_ptr文档,可以构建一个constexpr weak_ptr:
#include <memory>
constexpr weak_ptr<int> foo{};
Run Code Online (Sandbox Code Playgroud)
但是,使用clang尝试这个会产生一个编译错误,抱怨constexpr变量不能有非文字类型' const std::weak_ptr<int>',这是因为weak_ptr<int>有一个用户提供的析构函数.(确实如此,查看libc ++标头)
我的问题是,这是一个libc ++错误,还是constexpr weak_ptr没有意义,并且constexpr默认构造函数是错误的?我可以期待这种情况在未来发挥作用吗?