C++ 如何检查哪个#define被编译成二进制?

C++ 如何检查哪个#define被编译成二进制?,c++,linux,C++,Linux,出于某种原因,cmake包含了错误的opensslv.h头,或者我认为是这样。我想确定并打印出“OPENSSL\u VERSION\u NUMBER”的哪个值被编译到了我的二进制文件中。 如何做到这一点?正如@Galik的评论所提到的,如果可以编辑源代码,则可以打印出宏的值 如果您只有一个二进制文件,那么就很难了,因为在编译器看到源代码之前,预处理器已经用它的值替换了宏名。因此二进制文件不包含任何指向原始宏名称的“链接” 在启用调试符号的情况下,一些编译器(以我的经验,clang做得最好)可以在

出于某种原因,cmake包含了错误的opensslv.h头,或者我认为是这样。我想确定并打印出“OPENSSL\u VERSION\u NUMBER”的哪个值被编译到了我的二进制文件中。
如何做到这一点?

正如@Galik的评论所提到的,如果可以编辑源代码,则可以打印出宏的值

如果您只有一个二进制文件,那么就很难了,因为在编译器看到源代码之前,预处理器已经用它的值替换了宏名。因此二进制文件不包含任何指向原始宏名称的“链接”

在启用调试符号的情况下,一些编译器(以我的经验,clang做得最好)可以在构建时将此类信息嵌入二进制文件中,这样它可以打印更好的错误消息并使调试更有效。
但是在一个没有调试符号的优化二进制文件中,你几乎就要倒霉了。也就是说,除非您开始深入了解二进制文件的反汇编,了解宏的使用位置以及它可能需要的潜在值。然后你也许可以把它挖出来。

正如@Galik的评论所提到的,如果你可以编辑源代码,你可以打印出宏的值

如果您只有一个二进制文件,那么就很难了,因为在编译器看到源代码之前,预处理器已经用它的值替换了宏名。因此二进制文件不包含任何指向原始宏名称的“链接”

在启用调试符号的情况下,一些编译器(以我的经验,clang做得最好)可以在构建时将此类信息嵌入二进制文件中,这样它可以打印更好的错误消息并使调试更有效。
但是在一个没有调试符号的优化二进制文件中,你几乎就要倒霉了。也就是说,除非您开始深入了解二进制文件的反汇编,了解宏的使用位置以及它可能需要的潜在值。那么你就可以挖掘出来了。< /P> <代码> STD::CUT@ Galik,你有没有混合C和C++的特殊原因?为什么不使用
std::endl
?如果您想使用
\n
它应该是一个
printf
,如果您要使用
std::cout
,那么这应该是所有语句的标准,并且应该继续使用标准库。@Ingenioushax:你在说什么<代码> \n′/COD>是完全有效的C++字符文字。@ InEnIouHuxAX代码> \N/COD>添加换行符。code>std::endl添加换行符并刷新流。两件不同的事情<代码> \n完全是好的(而且是优选的),当你只需要换行而不是刷新时。@ <使用EngiouthHax使用<代码> \n '/COD>不是“混合C和C++”-结束一行与>\n′/Cord>完全有效的C++。两者之间唯一的真正区别是:<代码> STD::EntL//Cux.<代码> STD::CUT@ Galik,你是否混合C和C++有什么特殊的原因?为什么不使用
std::endl
?如果您想使用
\n
它应该是一个
printf
,如果您要使用
std::cout
,那么这应该是所有语句的标准,并且应该继续使用标准库。@Ingenioushax:你在说什么<代码> \n′/COD>是完全有效的C++字符文字。@ InEnIouHuxAX代码> \N/COD>添加换行符。code>std::endl添加换行符并刷新流。两件不同的事情<代码> \n完全是好的(而且是优选的),当你只需要换行而不是刷新时。@ <使用EngiouthHax使用<代码> \n '/COD>不是“混合C和C++”-结束一行与>\n′/Cord>完全有效的C++。两者之间唯一的真正区别是
std::endl