testing - 如果源文件中存在已定义的符号,gcc 可以进行测试吗

标签 testing makefile

gcc make 是否可以测试某个源文件中是否存在定义,即。

ifeq (DEFINED_BLAH_BLAH,3) @echo 等于 3 别的 @echo 不等于 3 结束

最佳答案

我已经看过这个并根据评论中的建议进行扩展,您可以执行以下操作。不优雅,可能不是最好的解决方案,但它有效:

echo -ne "#if 1==MYVAL\n0\n#else\n1\n#endif\n" | cpp -P -imacros test.h

或者通过gccg++调用:

echo -ne "#if 1==MYVAL\n0\n#else\n1\n#endif\n" | \
gcc -Xpreprocessor -P -E -imacros test.h -

这些将返回 shell 样式 0(对于 test.h 中定义的 MYVAL 为真并且为 1)或 stdout 上的 1,您可以在 make/shell 中对其进行测试。

您可能还想删除附加 | 的所有空行grep -v '^$'.

对上面的内容进行更详细的说明。我创建 (echo) 作为简单文件,我通过预处理器运行它检查给定宏的相等性并导致 01 在输出中。 -P 用于 cpp,因为它不是真正的 C 文件,我们不需要输出中的任何额外位。 -imacros 表示保留该文件中定义的宏,但丢弃处理它产生的任何输出。

还应注意,如果您有任何条件定义需要考虑传递给编译器的任何定义,您也需要将它们传递给此 cpp 运行。

还要注意您是否知道 test.h 作为您的头文件应该包含宏定义。或者 main.c 作为包含该(和其他) header 的源文件并不重要/产生相同的结果(无论 cpp 完成时的值是什么为 -imacros 读取和(预处理)文件。

关于testing - 如果源文件中存在已定义的符号,gcc 可以进行测试吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50196811/

相关文章:

c++ - Cmake 构建失败,CMAKE_AR-NOTFOUND(未找到 cr exe)

javascript - 如何将 Selenium 用于桌面应用程序?

makefile - gnu make : how to automatically list and build all targets

c - GNU make 和对象列表

makefile - gnumake 和模式规则

java - JUnit - assertFalse 不排除 == 运算符?

asp.net-mvc - 集成测试 ASP.NET MVC 应用程序

testing - 在一个奴隶的项目之间共享工件

java - 如何模拟基于 ActorSelection 的 Actor ?

python - 对 `scons -c` 执行自定义操作