如果我不知道在哪里可以找到 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
__has_include
需要具有与放置在 #include
指令中完全相同的查找规则。来自 [cpp.cond]#4 (强调我的):
然后我们就知道搜索由每个包含的 has-include-expression 中的带括号的预处理标记序列标识的头文件或源文件,就好像该预处理标记序列是
指令中的pp-tokens
一样,除了不再进行进一步的搜索之外执行宏扩展。 如果这样的指令不能满足 #include 指令的语法要求,则该程序格式错误。 如果搜索源文件成功,则 has-include-expression 的计算结果为 1;如果搜索失败,则计算结果为 0。#include
#include <filename>
和
#include "filename"
之间的区别。再次来自标准 [cpp.include]#3(强调我的):
表单的预处理指令所以是的,您的两次尝试的行为应该完全相同。请注意,如果您反向查找并首先检查
# include " q-char-sequence " new-line
导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。 以实现定义的方式搜索指定的源文件。 如果不支持此搜索,或者如果搜索失败,则会重新处理该指令,就好像它读取一样
# include < h-char-sequence > new-line
具有与原始指令相同的包含序列(包括 > 字符,如果有的话)。
<simde>
,则可能会有所不同 - 如果您的编译器通过
<>
和
""
查找找到不同的文件,结果会有所不同。