其他源文件无法调用隐函数,warning: implicit declaration of function

摘要:所谓的隐函数就是只在本.c,或者.cpp文件中声明( 没在头文件中声明的函数)的函数. 对于其非本文件的称之为隐世函数.  

万恶之源:C语言中的隐式函数声明

 

今天在调用postgresql源码中get_rel_name()函数时,不小心调用了隐函数get_relation_name();出现

delrelation_record.c:70:16: warning: implicit declaration of function ‘get_relation_name’ [-Wimplicit-function-declaration]
   table_name = get_relation_name(relOid);
                ^~~~~~~~~~~~~~~~~
delrelation_record.c:70:14: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
   table_name = get_relation_name(relOid);
              ^
delrelation_record.c:92:5: warning: ‘res’ may be used uninitialized in this function [-Wmaybe-uninitialized]
     PQclear(res);

这里 我们比较比较get_rel_name()   和 get_relation_name()  有什么不同.

首先:看源码get_rel_name();

src/backend/utils/cache/lsyscache.c

char *
get_rel_name(Oid relid)
{
	HeapTuple	tp;

	tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
	if (HeapTupleIsValid(tp))
	{
		Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
		char	   *result;

		result = pstrdup(NameStr(reltup->relname));
		ReleaseSysCache(tp);
		return result;
	}
	else
		return NULL;
}

然后看get_relation_name();

src/backend/utils/adt/ruleutils.c 

/*
 * get_relation_name
 *		Get the unqualified name of a relation specified by OID
 *   和get_rel_name()  函数的不同就是多了一个判断error的条件.
 * This differs from the underlying get_rel_name() function in that it will
 * throw error instead of silently returning NULL if the OID is bad.
 */
static char *
get_relation_name(Oid relid)
{
	char	   *relname = get_rel_name(relid);

	if (!relname)
		elog(ERROR, "cache lookup failed for relation %u", relid);
	return relname;
}

按理说调用哪个都可以啊.然后再看看函数声明的位置.

get_relation_name()  在src/backend/utils/adt/ruleutils.c   和函数声明在有一个文档里.

static char *get_relation_name(Oid relid);

而get_rel_name()  在src/include/commands/extension.h   在头文件里,

外界函数想要调用它,只需添加头问价就可以.

extern Oid	get_extension_oid(const char *extname, bool missing_ok);

所以,举个例子就会很容明白隐函数的用途.防止被外界调用.

你可能感兴趣的:(c,c++)