我正在嘗試使用這篇文章中的 __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
}
它可以編譯,但它仍然告訴我它們都存在,即使對于由原始 winasock2 組成的 winaaasock2 也是如此。
它需要在 <> 符號和引號內,所以我使用了反斜杠
在沒有回圈的情況下使用相同的代碼
#if __has_include("winaaasock2.h")
#include "winaaasock2.h"
cout << "Ok";
#else
cout << "Error";
#endif
這里的輸出是錯誤,使用像 unistd.h 這樣的庫,輸出沒問題,因為它存在
我錯過了什么?提前致謝
uj5u.com熱心網友回復:
它編譯
它不應該。C 語言不允許在命名空間范圍內使用諸如回圈之類的運算式陳述句。示例程式格式不正確。
除此之外,前處理器不了解您的回圈。有兩種可能的方式來處理您的程式:
// 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";
}
如果您要做的只是檢查所有標題是否存在,否則會產生錯誤,那么__has_include不會為您提供任何用處。您應該簡單地包括它們。如果缺少標頭,則會出現解釋問題的錯誤訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/429391.html
