2010-01-27 11 views
7

सबसे आसान तरीका का उपयोग कर अजगर सी एक्सटेंशन में जीआईएल हेरफेर करने के लिए अजगर सी विस्तार में जीसीसी चेतावनी से बचने के लिए कैसे मैक्रो प्रदान की उपयोग करने के लिए है मेरे कोड का बड़ा हिस्सा, लेकिन कोड की छोटी बिट्स के लिए इसे फिर से पकड़ना जिसकी आवश्यकता है।जब Py_BEGIN_ALLOW_THREADS

समस्या है जब मैं जीसीसी के साथ इस संकलन, मैं मिलता है:

ext/engine.c:548: warning: '_save' might be used uninitialized in this function 

क्योंकि Py_BEGIN_ALLOW_THREADS इस तरह परिभाषित किया गया है:

#define Py_BEGIN_ALLOW_THREADS { \ 
     PyThreadState *_save; \ 
     _save = PyEval_SaveThread(); 

तो, तीन प्रश्न:

  1. है जीसीसी की चेतावनी को दबाने के लिए संभव है,
  2. करता है किसी को भी कोई विचार है कि जीसीसी _save का उपयोग क्यों नहीं किया जा सकता है, क्योंकि इसे इसकी घोषणा के तुरंत बाद सौंपा गया है, और
  3. समस्या से बचने के लिए मैक्रो को एक कथन में घोषित करने और प्रारंभ करने के लिए क्यों परिभाषित नहीं किया गया है?

(अंतिम दो वास्तव में केवल अपनी जिज्ञासा के लिए हैं)।

मैं मैक्रोज़ का उपयोग न करके और इसे स्वयं कर कर इस मुद्दे से बच सकता हूं, लेकिन मैं नहीं चाहता।

उत्तर

3
  1. हां, -वोनो-उपसर्ग का उपयोग करके अनियमित चेतावनियों को दबाना संभव है।

-Wall -Wno-uninitialized

तुम सिर्फ इस चेतावनी को निकालना चाहते हैं, तो आप बस एक नल पॉइंटर को _save प्रारंभ कर सकता है इतना है कि यह एक समारोह वापसी मान पर निर्भर नहीं करता ... कि कोड की एक पंक्ति और एक टिप्पणी मेरे लिए समझ में आता है:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */ 
_save = PyEval_SaveThread(); 
+0

मैं इस लाइन पर केवल एक चेतावनी को अक्षम करने के लिए एक बहुत ही स्थानीय तरीके की उम्मीद कर रहा था। मैं सभी अनियमित चेतावनियों को अक्षम नहीं करना चाहूंगा। –

+0

यदि आप केवल इस चेतावनी को रोकना चाहते हैं, तो '_save' को शून्य सूचक में प्रारंभ करने के लिए 'PyEval_SaveThread()' को कॉल करने से पहले एक पंक्ति जोड़ें (ऊपर अपडेट किए गए उत्तर को देखें) –

1

मेरे दो सेंट:

  1. आप विशिष्ट चेतावनी को दबाने सकता है, लेकिन मुझे लगता है कि आप पहले से ही जानते थे।
  2. इसे कहते हैं हो सकता है अप्रारंभीकृत :-)
  3. एकमात्र कारण मैं कल्पना कर सकते हैं बड़े सी compilers साथ संगतता है।

मैंने the source में खोदने की कोशिश की, लेकिन कोई अच्छा संकेत नहीं मिला।

+1

1. मुझे पता था कि मैं चेतावनी के पूरे वर्गों को अक्षम कर सकता हूं कमांड लाइन, लेकिन मैं एक प्रगा की उम्मीद कर रहा था जो सिर्फ एक चेतावनी को अक्षम कर सकता था। –

0

नेड, आप one of these कोशिश कर सकते हैं:

#pragma GCC diagnostic warning "-Wno-unitialized" 
#pragma GCC diagnostic error "-Wno-uninitialized" 
#pragma GCC diagnostic ignored "-Wno-uninialized" 

या -Wuninitialized उपेक्षा? दस्तावेज़ीकरण के अनुसार, आपको किसी भी डेटा या कार्यों को परिभाषित करने से पहले ऐसा करना होगा। हो सकता है कि यह आपको केवल उस फ़ाइल के लिए चेतावनी को अक्षम कर देगा?