__has_include 的正确用法是什么

问题描述 投票:0回答:1

如果我不知道在哪里可以找到 simde 标头,我应该写(例如):

#if __has_include("simde")
# include "simde"
#elif __has_include(<simde>)
# include <simde>
#else
# include <intrin.h>
#endif

或者我认为正确的答案应该是这样写:

#if __has_include("simde")
# include "simde"
#else
# include <intrin.h>
#endif
c++ c preprocessor
1个回答
0
投票

__has_include
需要具有与放置在
#include
指令中完全相同的查找规则。来自 [cpp.cond]#4 (强调我的):

搜索由每个包含的 has-include-expression 中的带括号的预处理标记序列标识的头文件或源文件,就好像该预处理标记序列是

pp-tokens
指令中的
#include
一样,除了不再进行进一步的搜索之外执行宏扩展。 如果这样的指令不能满足 #include 指令的语法要求,则该程序格式错误。 如果搜索源文件成功,则 has-include-expression 的计算结果为 1;如果搜索失败,则计算结果为 0。

然后我们就知道

#include <filename>

#include "filename"
之间的
区别。再次来自标准 [cpp.include]#3(强调我的):

表单的预处理指令

# include " q-char-sequence " new-line
导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。
以实现定义的方式搜索指定的源文件。
如果不支持此搜索,或者 

如果搜索失败,则会重新处理该指令,就好像它读取一样

# include < h-char-sequence > new-line

具有与原始指令相同的包含序列(包括 > 字符,如果有的话)。

所以是的,您的两次尝试的行为应该完全相同。请注意,如果您反向查找并首先检查

<simde>

,则可能会有所不同 - 如果您的编译器通过 
<>
""
 查找找到不同的文件,结果会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.