小编clo*_*ord的帖子

使用预处理器部分处理文件

我们继承了一个非常卷积的项目(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)

c c++ c-preprocessor

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

构造一个constexpr std :: weak_ptr

根据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默认构造函数是错误的?我可以期待这种情况在未来发挥作用吗?

c++ destructor weak-ptr constexpr c++11

4
推荐指数
1
解决办法
197
查看次数

标签 统计

c++ ×2

c ×1

c++11 ×1

c-preprocessor ×1

constexpr ×1

destructor ×1

weak-ptr ×1