সতর্কতা: ফাংশনের অন্তর্নিহিত ঘোষণা


201

আমার সংকলক (জিসিসি) আমাকে সতর্কতা দিচ্ছে:

সতর্কতা: ফাংশনের অন্তর্নিহিত ঘোষণা

কেন এটি আসছে তা বুঝতে দয়া করে আমাকে সহায়তা করুন।


1
একটি "কেন এটা না করার সময় একটি ত্রুটি সংস্করণ দিতে না": stackoverflow.com/questions/434763/...
সিরো Santilli郝海东冠状病六四事件法轮功

আপনি যদি একটি শিরোনাম ফাইল অন্তর্ভুক্ত করতে ভুলে যান তবে এটিও ঘটতে পারে। উদাহরণস্বরূপ, যদি আপনি
স্ট্রিং.কে অন্তর্ভুক্ত না করে স্ট্রেন

উত্তর:


230

আপনি এমন একটি ফাংশন ব্যবহার করছেন যার জন্য সংকলক এখনও কোনও ঘোষণা (" প্রোটোটাইপ ") দেখেনি ।

উদাহরণ স্বরূপ:

int main()
{
    fun(2, "21"); /* The compiler has not seen the declaration. */       
    return 0;
}

int fun(int x, char *p)
{
    /* ... */
}

সরাসরি বা শিরোনামে আপনাকে প্রধান হিসাবে এর আগে আপনার ফাংশনটি ঘোষণা করতে হবে:

int fun(int x, char *p);

9
সংযোজন হিসাবে যদি আপনি প্রোটোটাইপ দিয়ে থাকেন তবে পরীক্ষা করুন যে এটি কেবল একটি টাইপো নয়। এছাড়াও যদি এটি কোনও বাহ্যিক গ্রন্থাগার থেকে থাকে তবে এটি অন্তর্ভুক্ত করেছেন কিনা তা পরীক্ষা করে দেখুন।
স্মিটেক

1
আমি এই সতর্কতা পাওয়ার পরে কোড চালাতে পারি না। সুতরাং এটি একটি ত্রুটির মতো আচরণ করে।
মিয়েন

@ ফ্লিম, সি 99 এবং সি 89 / সি 90 এর আলাদা আলাদা সেটিংস রয়েছে
কীভাবে চেন


1
@ ZachSaw ঠিক তাই। অন্যথায় আপনি নিজেকে তিনবার পুনরাবৃত্তি না।
নিমা মৌসভী

19

সঠিক উপায়টি শিরোনামে ফাংশন প্রোটোটাইপ ঘোষণা করা।

উদাহরণ

main.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

main.c

#include "main.h"

int main()
{
    some_main("Hello, World\n");
}

int some_main(const char *name)
{
    printf("%s", name);
}

একটি ফাইলের সাথে বিকল্প (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}

7

আপনি যখন মেইন.সি. তে আপনার # অন্তর্ভুক্ত করবেন তখন অন্তর্ভুক্ত তালিকার শীর্ষে রেফারেন্সড ফাংশনযুক্ত ফাইলটিতে # অন্তর্ভুক্ত রেফারেন্সটি রাখুন। উদাহরণস্বরূপ বলুন এটি মেন।

#include "SSD1306_LCD.h"    
#include "system.h"        #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"  // This has the 'BYTE' type definition

উপরেরগুলি "ফাংশনটির অন্তর্নিহিত ঘোষণা" ত্রুটি উত্পন্ন করবে না, তবে নীচে হবে-

#include "system.h"        
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"     // This has the 'BYTE' type definition
#include "SSD1306_LCD.h"    

ঠিক একই # অন্তর্ভুক্ত তালিকা, ঠিক আলাদা অর্ডার।

ঠিক আছে, এটা আমার জন্য হয়েছে।


3

আপনি যখন error: implicit declaration of functionএটি পান তা আপত্তিজনক ফাংশন তালিকাভুক্ত করা উচিত। প্রায়শই এই ত্রুটিটি একটি ভুলে যাওয়া বা অনুপস্থিত শিরোলেখ ফাইলের কারণে ঘটে থাকে, সুতরাং শেল প্রম্পটে আপনি টাইপ করতে পারেন man 2 functionnameএবং SYNOPSISউপরের অংশটি দেখতে পারেন , কারণ এই বিভাগটি যে কোনও শিরোলেখ ফাইলকে অন্তর্ভুক্ত করার জন্য তালিকাবদ্ধ করবে। অথবা http://linux.die.net/man/ এ চেষ্টা করুন এটি হ'ল লিঙ্কযুক্ত এবং অনুসন্ধান করা সহজ এমন অনলাইন ম্যান পেজ। ফাংশনগুলি প্রায়শই শিরোনাম ফাইলগুলিতে সংজ্ঞায়িত করা হয়, কোনও প্রয়োজনীয় হেডার ফাইল সহ প্রায়শই উত্তর হয়। স্নিকুটারের মতো বলেছিলেন,

আপনি এমন একটি ফাংশন ব্যবহার করছেন যার জন্য সংকলক এখনও কোনও ঘোষণা ("প্রোটোটাইপ") দেখেনি।


2

আপনার যদি সঠিক শিরোনামগুলি সংজ্ঞায়িত করা থাকে এবং একটি অ GlibCলাইব্রেরি ব্যবহার করছেন (যেমন মুসুল সি ) GNU এক্সটেনশানগুলির মুখোমুখি হওয়ার gccসময় নিক্ষেপ করবে ।error: implicit declaration of functionmalloc_trim

সমাধানটি হ'ল এক্সটেনশন এবং শিরোলেখ মোড়ানো :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif

1

আপনার মূল ফাংশনের আগে আপনাকে কাঙ্ক্ষিত ফাংশনটি ঘোষণা করতে হবে:

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

0

আমি মনে করি যে প্রশ্নের উত্তর 100% নয়। আমি নিখোঁজ টাইফফ () নিয়ে সমস্যাটি অনুসন্ধান করছিলাম, যা সংকলনের সময় নির্দেশিকা।

নিম্নলিখিত লিঙ্কগুলি পরিস্থিতি সম্পর্কে আলোকপাত করবে:

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

মতানুসারে __typeof__()পরিবর্তে ব্যবহার করার চেষ্টা করুন । এছাড়াও gcc ... -Dtypeof=__typeof__ ...সাহায্য করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.