我正在使用包含许多编译选项的复杂C代码。 这使得代码非常难以阅读。 我想生成一个反映实际编译方式的代码副本。 我使用“unifdef”实用程序得到了相当不错的结果,直到最近我还不知道。 但是,我很困惑为什么这么难以调用,我想知道我是否遗漏了什么。
考虑这个例子:
#ifdef A printf("An"); #endif #ifdef B printf("Bn"); #endif
如果你使用“unifdef -DA junk.c”调用unifdef,你会得到:
printf("An"); #ifdef B printf("Bn"); #endif
因为你没有告诉unifdef B是未定义的,所以它没有把它拿出来。
我希望该实用程序的行为如此,当我说unifdef -DA时,我得到了:
printf("An");
这将对应于C预处理器实际执行的操作:省略了未定义的任何分支。
要使用unifdef获得此行为,我似乎需要使用“unifdef -DA -UB junk.c”,明确告诉它B未定义。 虽然也许我错过了一种更简单的方式来调用它。
我编写了一个python脚本,从我正在使用的代码的Makefile中生成所需的-D和-U标志的长列表(通常每个例程80个)。 结果非常好。 但我想知道这样的剧本是否真的有必要。
另外一个实用程序(sunifdef?coan?)也可能已经内置了我想要的行为; 如果是的话,请提及。
coan
实用程序使用-m
标志执行您所需的操作:
$ coan source -DA -m test.c printf("An");
从手册页:
-m, --implicit Assume that any symbol that is not --define-ed is implicitly --undef-ed.
您可以使用unifdef附带的unifdefall实用程序。 见https://dotat.at/prog/unifdef
如果我正确地理解了你的问题,你想在预处理器运行之后看到代码,对吗? 那么为什么不让预处理器运行它并查看它产生的输出? 只需使用编译时使用的完全相同的参数运行编译调用,但是将参数-E
添加到它,这意味着“除了预处理之外什么都不做”。
$ cat preproc.c #ifdef A printf("An"); #endif #ifdef B printf("Bn"); #endif $ gcc -E preproc.c # 1 "preproc.c" # 1 "" # 1 "" # 1 "preproc.c" $ gcc -E -DA preproc.c # 1 "preproc.c" # 1 "" # 1 "" # 1 "preproc.c" printf("An"); $ gcc -E -DB preproc.c # 1 "preproc.c" # 1 "" # 1 "" # 1 "preproc.c" printf("Bn"); $
以上就是c/c++开发分享默认情况下使用unifdef省略未定义的预处理器分支的方法?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544748.html