C ++ da ilgarigi e'lonlarni yo'qotish bilan bog'liq

C funktsiyasini oldindan e'lon qilish funksiyasiz quyidagi dasturni tuzdim. Har qanday ogohlantirish yoki xatosiz muvaffaqiyatli olingan va GCC da ishlaydi.

#include 

int main()
{
        int ret = func(10, 5);
}

int func(int i, int j)
{
        return (i+j);
}

Ammo, C ++ da oldindan e'lon qilish funktsiyasisiz, quyidagi dasturni tayyorladim, Compiler menga xatolik beradi.

#include 
using namespace std;

int main()
{
        int ret = func(10, 5);
}

int func(int i, int j)
{
        return (i+j);
}

Xato:

fl.cpp:6:22: error: ‘func’ was not declared in this scope
  int ret = func(10, 5);
                      ^

Nima uchun C ++ kompilyatori xato qilmoqda?

1
"Nima uchun C ++ kompilyatori xato yaratadi?" Odatdagidek: standart shuni bildiradiki.
qo'shib qo'ydi muallif Baum mit Augen, manba
"Nima uchun C ++ kompilyatori xato yaratadi?" Odatdagidek: standart shuni bildiradiki.
qo'shib qo'ydi muallif Baum mit Augen, manba
C va C ++ o'rtasida taqqoslash uchun bu savolni so'rashganida, C yorlig'i orqaga qo'shildim. Savolning asosiy qismi noto'g'ri bo'lsa (c == c ++), bu teglar bu erda muhimdir. Kimdir rozi bo'lmasa, menga xabar bering.
qo'shib qo'ydi muallif Sourav Ghosh, manba
Odatda, matn terish tizimi bo'lishi kerak. :)
qo'shib qo'ydi muallif Sourav Ghosh, manba
Odatda, matn terish tizimi bo'lishi kerak. :)
qo'shib qo'ydi muallif Sourav Ghosh, manba
@CraigYoung Xo'sh, uni tuz donasi bilan olib boring. Bu savol C va C ++ ning ikki xil tilga ega bo'lgan bilimlar etishmasligidan kelib chiqadi va shunga mos kelishi kerak. Boshqa hech narsa. :)
qo'shib qo'ydi muallif Sourav Ghosh, manba
@CraigYoung uni "fwd decl ..." deb o'qidi
qo'shib qo'ydi muallif Sourav Ghosh, manba
@CraigYoung Xo'sh, uni tuz donasi bilan olib boring. Bu savol C va C ++ ning ikki xil tilga ega bo'lgan bilimlar etishmasligidan kelib chiqadi va shunga mos kelishi kerak. Boshqa hech narsa. :)
qo'shib qo'ydi muallif Sourav Ghosh, manba
Javoblar sarlavhasi "C ++" funksiyalaridan oldin deklaratsiyalarni talab qiladiganligi va shuning uchun ba'zi holatlarda "oldindan deklaratsiya" kerakligi haqida faqat bitta shikoyat bormi?
qo'shib qo'ydi muallif Craig Young, manba
Javoblar sarlavhasi "C ++" funksiyalaridan oldin deklaratsiyalarni talab qiladiganligi va shuning uchun ba'zi holatlarda "oldindan deklaratsiya" kerakligi haqida faqat bitta shikoyat bormi?
qo'shib qo'ydi muallif Craig Young, manba
@SouravGhosh - Qizig'i shundaki, zamonaviy C va C ++ bu fikrga qo'shiladi :)
qo'shib qo'ydi muallif StoryTeller, manba
Hech qachon C ++ da, va endi C da 99dan
qo'shib qo'ydi muallif StoryTeller, manba
Javob aslida bitta o'tish kompilyatori sifatida yaratilgan edi, shuning uchun uni ishlatishdan oldin narsalarni e'lon qilishingiz kerak.
qo'shib qo'ydi muallif cup, manba
Birinchi kod kompyuterimga yozilmaydi. Bu menga "identifikator topilmadi" xatosi beradi. Windows Desktop uchun Visual Studio 2012 Express Edition'dan foydalanaman. Btw, ichiga oldida # bo'lishi kerak, lekin menimcha, bu kod kompyuteringizda tuzilgan.
qo'shib qo'ydi muallif daniel, manba
Birinchi kod kompyuterimga yozilmaydi. Bu menga "identifikator topilmadi" xatosi beradi. Windows Desktop uchun Visual Studio 2012 Express Edition'dan foydalanaman. Btw, ichiga oldida # bo'lishi kerak, lekin menimcha, bu kod kompyuteringizda tuzilgan.
qo'shib qo'ydi muallif daniel, manba

8 javoblar

C ++ da bo'lgani kabi, C da xato.

Ushbu savolga kodni C derleyici nuqtai nazaridan tegishli deb bilgan holda, "taxmin" ga asoslanib, savolga javob beradigan bo'lsak, spets ( C11 ), funktsiyalarning bevosita deklaratsiya qilinishiga yo'l qo'yilmaydi. O'zingizning kodingizni qattiq muvofiqlik bilan kompilyatsiya qiling va (har qanday mos keladigan) derivat S da bir xil xatoni ishlab chiqaradi.

Jonli misolni ko'ring

Quoting C11, Foreword/p7, "Major changes in the second edition included:"

      
  • ifodalangan funktsiya deklaratsiyasini o'chirib tashlash
  •   

va ayni paytda C99 da mavjud.


Note: On why it might have worked

Pre C99 , bu kodni muvaffaqiyatli tarzda kompilyatsiya qilish uchun joy bor edi. Funksiyaning yo'qolgan prototipi mavjud bo'lsa, funktsiya int funksiyasini qaytaradi va kiritilgan parametrlarni qabul qiladi. Bu endi juda nostandart va eski yordamga ega kompilyatorlar bunday kodni tuzishga ruxsat berishni tanlashi mumkin, ammo qat'iyan, mos keluvchi kompilyator buni amalga oshirishdan bosh tortishi kerak.

3
qo'shib qo'ydi
@Peter Ba'zan siz imkoniyatlari bilan "moslik" ni bajarishingiz kerak, u sukut bo'yicha emas ... bu men aytayapman.
qo'shib qo'ydi muallif Sourav Ghosh, manba
C99 yoki undan keyingi versiyalarga mos keladigan kompilyator kodni rad etadi. 1999 yildan eski komponentlar yoki "C89" rejimlarida (masalan, gcc -stdc89 ), odatda C99ga mos kelmaydi.
qo'shib qo'ydi muallif Peter, manba

C ++ da bo'lgani kabi, C da xato.

Ushbu savolga kodni C derleyici nuqtai nazaridan tegishli deb bilgan holda, "taxmin" ga asoslanib, savolga javob beradigan bo'lsak, spets ( C11 ), funktsiyalarning bevosita deklaratsiya qilinishiga yo'l qo'yilmaydi. O'zingizning kodingizni qattiq muvofiqlik bilan kompilyatsiya qiling va (har qanday mos keladigan) derivat S da bir xil xatoni ishlab chiqaradi.

Jonli misolni ko'ring

Quoting C11, Foreword/p7, "Major changes in the second edition included:"

      
  • ifodalangan funktsiya deklaratsiyasini o'chirib tashlash
  •   

va ayni paytda C99 da mavjud.


Note: On why it might have worked

Pre C99 , bu kodni muvaffaqiyatli tarzda kompilyatsiya qilish uchun joy bor edi. Funksiyaning yo'qolgan prototipi mavjud bo'lsa, funktsiya int funksiyasini qaytaradi va kiritilgan parametrlarni qabul qiladi. Bu endi juda nostandart va eski yordamga ega kompilyatorlar bunday kodni tuzishga ruxsat berishni tanlashi mumkin, ammo qat'iyan, mos keluvchi kompilyator buni amalga oshirishdan bosh tortishi kerak.

3
qo'shib qo'ydi
@Peter Ba'zan siz imkoniyatlari bilan "moslik" ni bajarishingiz kerak, u sukut bo'yicha emas ... bu men aytayapman.
qo'shib qo'ydi muallif Sourav Ghosh, manba
C99 yoki undan keyingi versiyalarga mos keladigan kompilyator kodni rad etadi. 1999 yildan eski komponentlar yoki "C89" rejimlarida (masalan, gcc -stdc89 ), odatda C99ga mos kelmaydi.
qo'shib qo'ydi muallif Peter, manba

Nega C ++ kompilyatori xatoga yo'l qo'ydi?

C ++ da e'lon qilinmagan vazifalarni chaqirmasligingiz uchun.

Sukut bo'yicha int ma'lumot turini olish emasmi?

Yo'q. Bu boshqa tilda ishlatilgan. S ++ da (yoki keyinchalik standart versiyalardan beri) bunday holat emas.

2
qo'shib qo'ydi

Nega C ++ kompilyatori xatoga yo'l qo'ydi?

C ++ da e'lon qilinmagan vazifalarni chaqirmasligingiz uchun.

Sukut bo'yicha int ma'lumot turini olish emasmi?

Yo'q. Bu boshqa tilda ishlatilgan. S ++ da (yoki keyinchalik standart versiyalardan beri) bunday holat emas.

2
qo'shib qo'ydi

Rasmni yakunlash va javobni Sourav Ghosh bilan bog'lang. C ++ standarti bu masala haqida gapirish kerak:

[expr.call] p2:

[Eslatma: Agar funktsiya yoki a'zo funktsiyasi nomi ishlatilsa va ism qidirish bu nomning e'lonini topmasa, dastur noto'g'ri shakllanadi. Hech bir funktsiya bunday chaqiruv bilan bevosita e'lon qilinmaydi. - so'nggi eslatma]

Bunga qaraganda aniqroq ma'lumot berilmadi.

1
qo'shib qo'ydi

Rasmni yakunlash va javobni Sourav Ghosh bilan bog'lang. C ++ standarti bu masala haqida gapirish kerak:

[expr.call] p2:

[Eslatma: Agar funktsiya yoki a'zo funktsiyasi nomi ishlatilsa va ism qidirish bu nomning e'lonini topmasa, dastur noto'g'ri shakllanadi. Hech bir funktsiya bunday chaqiruv bilan bevosita e'lon qilinmaydi. - so'nggi eslatma]

Bunga qaraganda aniqroq ma'lumot berilmadi.

1
qo'shib qo'ydi

In C++ you can't call an undeclared function. In C you can call a function without a forward declarator if the definition of the function returns an int. This is because of the old K&R function definition style. This is obsolete for ANSI-C, always declare a function with a prototype.

1
qo'shib qo'ydi
Bu juda kichik va juda ko'p noto'g'ri. Deklaratsiyalanmagan funktsiyaga duch kelganida, C derleyici deklaratsiyani qabul qiladi (qo'shimchalar hech qanday ilova topilmasa shikoyat qiladi). Bu taxmin noto'g'ri bo'lsa, ya'ni kodeksda keyinroq deklaratsiya yoki ilovani topsa,
qo'shib qo'ydi muallif parvus, manba
va taxmin bilan mos kelmasa, kompilyator xatosi berilgan. Bundan tashqari, derleyici versiyasi va derleyici bayroqlar ham ta'sir qilishi mumkin. Eng yaxshi maslahat: bu qilmang; har doim old tomondan e'lon qiling.
qo'shib qo'ydi muallif parvus, manba
@parvus, ha C kompilyatori deklaratsiyani qabul qiladi. Bu funktsiya deklarantining parametrlari mavjud bo'lmagan va agar funktsiya int ga qaytgan bo'lsa, sobiq K & R S funktsional uslubining merosi, deklaratsiya buzilgan bo'lishi mumkin.
qo'shib qo'ydi muallif T.Buys, manba

In C++ you can't call an undeclared function. In C you can call a function without a forward declarator if the definition of the function returns an int. This is because of the old K&R function definition style. This is obsolete for ANSI-C, always declare a function with a prototype.

1
qo'shib qo'ydi
Bu juda kichik va juda ko'p noto'g'ri. Deklaratsiyalanmagan funktsiyaga duch kelganida, C derleyici deklaratsiyani qabul qiladi (qo'shimchalar hech qanday ilova topilmasa shikoyat qiladi). Bu taxmin noto'g'ri bo'lsa, ya'ni kodeksda keyinroq deklaratsiya yoki ilovani topsa,
qo'shib qo'ydi muallif parvus, manba
va taxmin bilan mos kelmasa, kompilyator xatosi berilgan. Bundan tashqari, derleyici versiyasi va derleyici bayroqlar ham ta'sir qilishi mumkin. Eng yaxshi maslahat: bu qilmang; har doim old tomondan e'lon qiling.
qo'shib qo'ydi muallif parvus, manba
@parvus, ha C kompilyatori deklaratsiyani qabul qiladi. Bu funktsiya deklarantining parametrlari mavjud bo'lmagan va agar funktsiya int ga qaytgan bo'lsa, sobiq K & R S funktsional uslubining merosi, deklaratsiya buzilgan bo'lishi mumkin.
qo'shib qo'ydi muallif T.Buys, manba