如何处理C++文件以删除ifdef'd的代码

How to process C++ file to remove ifdef'd out code

本文关键字:ifdef 代码 删除 何处理 处理 文件 C++      更新时间:2023-10-16

我继承了一段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