在循环中使用 has_include 和变量来检查库

Using has_include with variables in a loop to check libraries

我正在尝试使用此 中的 __has_include 检查库是否可用。因为我想检查每个我正在使用循环

/* Array of Strings */

const char* libraries[5] = { "iostream", "unistd.h", "stdlib.h", "Windows.h", "winaaasock2.h"};

/* Getting the length of the array */

int librariesSize = sizeof(libraries)/sizeof(libraries[0]);

/* Looping through them (5 Times) */

for (int i = 0; i < librariesSize; i++) {
  #if __has_include(<\"libraries[i]"\>)
      #include <\"libraries[i]"\>
      cout << "Ok";
  #else
    cout << "Error";
  #endif
}

它编译了,但它仍然告诉我所有这些都存在,即使对于 winaaasock2,它是由原始的 winasock2 组成的。

它需要在 <> 符号和引号内,所以我使用了反斜杠

使用没有循环的相同代码有效

#if __has_include("winaaasock2.h")
    #include "winaaasock2.h"
    cout << "Ok";
#else
    cout << "Error";
#endif

这里的输出是错误的,像unistd.h这样的库输出是可以的,因为它存在

我错过了什么?提前致谢

It compiles

不应该。 C++ 语言不允许在命名空间范围内使用表达式语句,例如循环。示例程序是ill-formed.

除此之外,pre-processor 不知道您的循环。您的程序有两种可能的处理方式:

// if the header \"libraries[i]"\ exists
for (int i = 0; i < librariesSize; i++) {
    // content from header \"libraries[i]"\ 
    cout << "Ok";
}

// OR if the header \"libraries[i]"\ doesn't exist
for (int i = 0; i < librariesSize; i++) {
    cout << "Error";
}

如果您只想检查是否所有 header 都存在,否则会产生错误,那么 __has_include 将不会为您提供任何有用的信息。你应该简单地包括它们。如果 header 缺失,将出现解释该问题的错误消息。