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
或者通过gcc
或g++
调用:
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) 作为简单文件,我通过预处理器运行它检查给定宏的相等性并导致 0
或 1
在输出中。 -P
用于 cpp
,因为它不是真正的 C 文件,我们不需要输出中的任何额外位。 -imacros
表示保留该文件中定义的宏,但丢弃处理它产生的任何输出。
还应注意,如果您有任何条件定义需要考虑传递给编译器的任何定义,您也需要将它们传递给此 cpp
运行。
还要注意您是否知道 test.h
作为您的头文件应该包含宏定义。或者 main.c
作为包含该(和其他) header 的源文件并不重要/产生相同的结果(无论 cpp
完成时的值是什么为 -imacros
读取和(预处理)文件。
关于testing - 如果源文件中存在已定义的符号,gcc 可以进行测试吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50196811/