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

use*_*462 7 c++ c-preprocessor

我继承了一段 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
Run Code Online (Sandbox Code Playgroud)

会变成:

#include <iostream>

std::cout << "This is Apple!" << std::endl;
Run Code Online (Sandbox Code Playgroud)

处理后:tool_i_want example.cpp __APPLE__ .

我已经编写了一个快速脚本来执行类似的操作,但我想知道经过更好测试和更彻底的工具。我正在运行 Linux 发行版。

我决定不只运行 C 预处理器,因为如果我没有记错的话,它会扩展头文件,这将使所有内容变得更加难以阅读。

Bas*_*tch 6

使用unifdef。它就是为此目的而设计的。


use*_*462 3

为了补充 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
Run Code Online (Sandbox Code Playgroud)

如果简单地运行为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;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

当处理考虑到多个不同平台的代码时,这很快就会让人筋疲力尽。coan问题是:

coan source -D__APPLE__ -m example.cpp