2012-12-03 4 views
5

मैं अगले कोड है:g ++ इस कन्स्ट्रक्टर से संबंधित अस्वीकरण चेतावनी को '-fpic` सक्षम क्यों नहीं करता है?

#include <exception> 
#include <cstdlib> 

void g() { throw 1; } 
void (*p)() = g; 

template <class T> 
void f(T) noexcept (noexcept (T())) // warning 1 
{ 
    p(); 
} 

struct A { A() { } };   // warning 2 

int main() 
{ 
    try { f(A()); } catch (int) { } 
    return 1; 
} 

और अगले विकल्पों के साथ:
-fno-pic -fmessage-length=0 -std=c++0x -Wnoexcept
जी ++ अगले चेतावनी फेंक:

noexcept03.C:16:6: warning: noexcept-expression evaluates to 'false' because of a call to 'A::A()' [-Wnoexcept] 
noexcept03.C:21:12: warning: but 'A::A()' does not throw; perhaps it should be declared 'noexcept' [-Wnoexcept] 

लेकिन जब मैं -fno-pic के बजाय -fpic का उपयोग g++ फेंक नहीं है कोई चेतावनी?

संपादित करें:
जीसीसी संस्करण - 4.7.2

+0

जीसीसी का कौन सा संस्करण आप संकलन के लिए उपयोग कर रहे हैं? –

+0

@kumar_m_kiran 4.7.2 – Arseniy

उत्तर

5

चेतावनी, -fpic मामले में जारी नहीं किया गया है क्योंकि संकलक मानता है कि निर्माता A::A() फेंक कर सकते हैं।

पीआईसी कोड संकलित करते समय, जीसीसी मानता है कि प्रत्येक वैश्विक नाम को अन्य मॉड्यूल के प्रतीकों से ओवरराइड किया जा सकता है। इसलिए, एक स्पष्ट noexcept घोषणा की अनुपस्थिति के साथ, जीसीसी को रूढ़िवादी रूप से यह मानना ​​चाहिए कि ऐसा कोई कार्य अपवाद फेंक सकता है, भले ही यह स्थिर रूप से साबित हो सके कि वह संस्करण जो अब देख रहा है, वह नहीं कर सकता है।

संदर्भ के लिए, बग और पैच यहाँ देख http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29323#c7 (कोड एक छोटे के बाद से बदल गया है, लेकिन यह इस तरह शुरू कर दिया)

एक उदाहरण है, जहां ऊपर लागू होता है:

/* inline */ int f() { return 0; } 

int g() noexcept (noexcept(f())) { return f() + 1; } 

तो, यह तत्काल कारण है "क्यों" कोई चेतावनी नहीं है। इसके बारे में मैं क्या सोचता हूं।

हालांकि, सी ++ 11 का कहना है:

7.1.2 समारोह विनिर्देशक [dcl.fct.spec]

4 एक इनलाइन समारोह में हर अनुवाद इकाई में परिभाषित किया जाएगा जो यह है odr-used और में प्रत्येक मामले (3.2) में बिल्कुल वही परिभाषा होगी।

यानी इनलाइन फ़ंक्शंस के लिए, यदि कोई फ़ंक्शन फेंकने के लिए निर्धारित नहीं होता है, तो जीसीसी यह मान सकता है कि इस तरह के फ़ंक्शन के हर संभावित ओवरराइड को भी फेंक नहीं सकता है।

इस अर्थ में, जीसीसी इनलाइन कार्यों के साथ अत्यधिक रूढ़िवादी है और मूल परीक्षण मामले में और उपर्युक्त उदाहरण में inline कीवर्ड के साथ असम्बद्ध, जीसीसी को -fpic/-fPIC का उपयोग होने पर भी चेतावनी जारी करनी चाहिए।

+0

हाय, और उत्तर के लिए धन्यवाद। आपको यह कहां मिलता है 'पीआईसी कोड संकलित करते समय, जीसीसी मानता है कि प्रत्येक वैश्विक नाम को अन्य मॉड्यूल के प्रतीकों से ओवरराइड किया जा सकता है' मेरा मतलब कुछ पुस्तक/स्रोत है? कृपया लिंक प्रदान करें। – Arseniy

+0

@ पेपेलाक, स्रोत जीसीसी स्रोत कोड है :) वैसे, यह व्यवहार पीआईसी कोड के लिए विशिष्ट नहीं है, यह कमजोर कार्यों और कुछ अन्य मामलों के लिए भी समान है। – chill

+0

धन्यवाद फिर से मुझे पता चला है कि यह जीसीसी कोड में कहां लागू किया गया है, लेकिन मुझे लगता है कि शायद आप इसे कुछ मैनुअल से प्राप्त करते हैं) – Arseniy

संबंधित मुद्दे