मैंने इस तरह एक चर घोषित किया:
int i = 0;
मुझे चेतावनी मिली:
आईएसओ C90 मिश्रित घोषणाओं और कोड को निषिद्ध करता है
मेरे द्वारा यह कैसे किया जा सकता है?
मैंने इस तरह एक चर घोषित किया:
int i = 0;
मुझे चेतावनी मिली:
आईएसओ C90 मिश्रित घोषणाओं और कोड को निषिद्ध करता है
मेरे द्वारा यह कैसे किया जा सकता है?
-std=c99
) की अनुमति देता है ।
जवाबों:
मुझे लगता है कि आपको चर घोषणा को ब्लॉक के ऊपर ले जाना चाहिए। अर्थात
{
foo();
int i = 0;
bar();
}
सेवा
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
C99 मानक तक, सभी घोषणाओं को एक ब्लॉक में किसी भी बयान से पहले आना था:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 घोषणाओं और बयानों को मिलाने की अनुमति देता है (जैसे C ++)। कई कंपाइलर अभी भी C89 के लिए डिफॉल्ट हैं, और कुछ कंपाइलर (जैसे माइक्रोसॉफ्ट के) C99 को बिल्कुल भी सपोर्ट नहीं करते हैं ।
तो, आपको निम्नलिखित कार्य करने होंगे:
निर्धारित करें कि क्या आपका कंपाइलर C99 या बाद में सपोर्ट करता है; यदि ऐसा होता है, तो इसे कॉन्फ़िगर करें ताकि यह C89 के बजाय C99 को संकलित करे;
यदि आपका कंपाइलर C99 या बाद में सपोर्ट नहीं करता है, तो आपको या तो एक अलग कंपाइलर ढूंढना होगा, जो इसे सपोर्ट करता हो, या आपके कोड को फिर से लिखना ताकि सभी डिक्लेरेशन ब्लॉक के भीतर किसी भी स्टेटमेंट से पहले आ जाएं।
बस एक संकलक का उपयोग करें (या इसे ज़रूरत के तर्कों के साथ प्रदान करें) जैसे कि यह सी मानक, C99 या C11 के अधिक हाल के संस्करण के लिए संकलित करता है। उदाहरण के लिए, कंपाइलर के GCC परिवार के लिए -std=c99
।
-std=gnu89
में लिनक्स कर्नेल मॉड्यूल का संकलन करते समय उपयोग किया जाता है।
यह पता लगाने के लिए कि वास्तव में त्रुटि क्या होती है, मैं पहले हटाने की कोशिश करूंगा = 0
यदि त्रुटि फंस गई है, तो सबसे अधिक संभावना कोड के बाद घोषणा की जाती है।
यदि कोई त्रुटि नहीं है, तो यह सी-मानक प्रवर्तन / संकलित झंडे या ... कुछ और से संबंधित हो सकता है।
किसी भी स्थिति में, वर्तमान क्षेत्र की शुरुआत में चर घोषित करें। फिर आप इसे अलग से इनिशियलाइज़ कर सकते हैं। वास्तव में, यदि यह चर अपने दायरे के लायक है - तो इसकी परिभाषा को {} में परिसीमित करें।
यदि ओपी संदर्भ को स्पष्ट कर सकता है, तो एक अधिक निर्देशित प्रतिक्रिया का पालन होगा।
-Wdeclaration-after-statement
न्यूनतम प्रजनन योग्य उदाहरण
main.c
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
चेतावनी दें:
gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
gcc -std=c89 -pedantic -Werror main.c
चेतावनी न दें:
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
चेतावनी:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
उबंटू 16.04, जीसीसी 6.4.0 पर परीक्षण किया गया।
-pedantic
या-std=c89
, जिस स्थिति में आप चाहें तो इसे संकलित कर सकते-std=gnu99
हैं।