如何处理C++文件以删除ifdef'd的代码
How to process C++ file to remove ifdef'd out code
我继承了一段C++代码,该代码有许多#ifdef
分支,用于根据平台(#ifdef __WIN32
、#ifdef __APPLE__
等(调整行为。该代码在当前形式下是不可读的,因为这些预处理器指令是嵌套的,出现在函数的中间,甚至出现在多行语句的中间。
我正在寻找一种方法,以某种方式指定一些预处理器标记,并获得代码的副本,就好像代码已经用这些标记进行了预处理一样。不过,我希望#include指令保持不变。示例:
#include <iostream>
#ifdef __APPLE__
std::cout << "This is Apple!" << std::endl;
#elif __WIN32
std::cout << "This is Windows" << std::endl;
#endif
会变成:
#include <iostream>
std::cout << "This is Apple!" << std::endl;
经过:CCD_ 4处理后。
我已经破解了一个可以做类似事情的快速脚本,但我想知道更好的测试和更彻底的工具。我正在运行一个Linux发行版。
我决定不只是运行C预处理器,因为如果我没有记错的话,它会扩展头文件,这会使所有内容变得更不可读。
使用unifdef
。它就是为这个目的而设计的。
补充Basile Starynkevitch的回答,我想提到coan
。主要优点是,当与-m
一起使用时,它不需要用户取消设置他们想要定义的所有符号。
此代码:
#include <iostream>
#ifdef __ANDROID__
std::cout << "In Android" << std::endl;
#endif
#ifndef __WIN32
std::cout << "Not a Windows platform" << std::endl;
#endif
#ifdef __APPLE__
std::cout << "In an Apple platform" << std::endl;
#elif __linux__
std::cout << "In a Linux platform" << std::endl;
#endif
如果简单地运行为:unifdef -D__APPLE__ example.cpp
:,将导致此代码
#include <iostream>
#ifdef __ANDROID__
std::cout << "In Android" << std::endl;
#endif
#ifndef __WIN32
std::cout << "Not a Windows platform" << std::endl;
#endif
std::cout << "In an Apple platform" << std::endl;
使用unifdef
需要使用
unifdef -D__APPLE__ -U__ANDROID__ -U__WIN32 -U__linux__ example.cpp
:
#include <iostream>
std::cout << "Not a Windows platform" << std::endl;
std::cout << "In an Apple platform" << std::endl;
在处理考虑多种不同平台的代码时,这可能会很快让人筋疲力尽。对于coan
,这是一个问题:
coan source -D__APPLE__ -m example.cpp
。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免使用IFDEF使代码更具测试
- 如何处理C++文件以删除ifdef'd的代码
- 在代码中使用#ifdef是不是不好的做法?
- 不包括ifdef代码块的接口生成