निम्नलिखित कोड पर विचार करें: के रूप में आधुनिक compilers बढ़ीक्यों int int; एक = std :: अधिकतम (एक, एक्स) उत्सर्जन नहीं "अप्रारंभीकृत" चेतावनी
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> v{{1, 2, 3}};
int a;
std::cout << a << std::endl; // 1
for (const int x : v) {
a = std::max(a, x); // 2
}
std::cout << a << std::endl;
return 0;
}
और अब गूंगा प्रोग्रामर गलतियों पर एक सतर्क नजर रखना, वे ट्रैक प्रारंभिक चर हालांकि यह सी ++ कोड उन्हें भ्रमित करता है।
(1) (2)
g++ 5.3.1
clang++ 3.7 ✔
Solaris Studio 12.5 ✔
आप देख सकते हैं, बजना और solstudio, केवल मामले (1) का पता लगाने और मामले (2) को अनदेखा कर सकते हैं, जबकि जी ++ दोनों अनदेखी कर रहा है: अब तक, मैं निम्नलिखित परिणाम प्राप्त। मामले में (2) में इसका पता लगाने के लिए कोई जटिलता है? इस पर g ++ इतना बुरा क्यों है?
संकलक विकल्प मैं प्रयोग किया है:
$ g++-5 -std=c++11 -Wall -Wpedantic -pedantic -Wextra \
-Wuninitialized -Wmaybe-uninitialized aisa.cpp
$ clang++ -std=c++11 -Wall -Wpedantic -pedantic -Wextra -Wuninitialized aisa.cpp
$ CC -std=c++11 -xprevise aisa.cpp
दोनों जीसीसी और क्लैंग के बग ट्रैकर्स पर एक फीचर अनुरोध दर्ज करने पर विचार करें - इस तरह की छोटी स्थितियों को शायद अतिरिक्त तर्क –
के साथ पता लगाया जा सकता है यदि आप पहला उदाहरण हटाते हैं तो क्या होता है? क्या क्लैंग या सोलारिस स्टूडियो तब प्रारंभिक चर के बारे में चेतावनी देता है? –
यदि आप अनुकूलन स्तर को क्रैंक करते हैं तो आपको बेहतर चेतावनियां भी मिल सकती हैं। –