使用某类型是否用声明的思考

原因:

由于看linux协议栈内核源码使遇到了如下情况:

#ifndef _NET_NEIGHBOUR_H
#define _NET_NEIGHBOUR_H

#include <linux/neighbour.h>

/*
 *	Generic neighbour manipulation
 *
 *	Authors:
 *	Pedro Roque		<roque@di.fc.ul.pt>
 *	Alexey Kuznetsov	<kuznet@ms2.inr.ac.ru>
 *
 * 	Changes:
 *
 *	Harald Welte:		<laforge@gnumonks.org>
 *		- Add neighbour cache statistics like rtstat
 */

#include <asm/atomic.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/rcupdate.h>
#include <linux/seq_file.h>

#include <linux/err.h>
#include <linux/sysctl.h>
#include <linux/workqueue.h>
#include <net/rtnetlink.h>

/*
 * NUD stands for "neighbor unreachability detection"
 */

#define NUD_IN_TIMER	(NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)
#define NUD_VALID	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
#define NUD_CONNECTED	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)

struct neighbour;

struct neigh_parms
{
#ifdef CONFIG_NET_NS
	struct net *net;
#endif
	struct net_device *dev;
	struct neigh_parms *next;
	int	(*neigh_setup)(struct neighbour *);
	void	(*neigh_cleanup)(struct neighbour *);
	struct neigh_table *tbl;

	void	*sysctl_table;

	int dead;
	atomic_t refcnt;
	struct rcu_head rcu_head;

	int	base_reachable_time;
	int	retrans_time;
	int	gc_staletime;
	int	reachable_time;
	int	delay_probe_time;

	int	queue_len;
	int	ucast_probes;
	int	app_probes;
	int	mcast_probes;
	int	anycast_delay;
	int	proxy_delay;
	int	proxy_qlen;
	int	locktime;
};

neigh_parms中用的struct neighbour类型在使用前声明了下,而struct neigh_table类型却没有进行任何声明,这样难道不会出错吗?

验证:

验证一:

#include <stdio.h>

struct str2;

struct str1
{
    struct str2 st;
	int i1;
};

struct str2
{
	int i2;
};

int main()
{
	struct str1 stest1;
	stest1.st.i2 = 2;
	stest1.i1 = 1;
	
	printf("%d----%d\n", stest1.st.i2, stest1.i1);

	return 0;
}

运行结果为:

define1.c:7:17: 错误:字段‘st’的类型不完全
     struct str2 st;
                 ^
验证二:

#include <stdio.h>

//typedef struct str2* ST;
//struct str2;

struct str1
{
//	ST  pst;
    struct str2 * pst;
	int i1;
};

struct str2
{
	int i2;
};


int main()
{
	struct str1 stest1;
	struct str2 stest2;
	stest1.pst = &stest2;
	stest1.pst->i2 = 2;
	stest1.i1 = 1;

	printf("%d-----%d\n", stest1.pst->i2, stest1.i1);

	return 0;
}

运行结果:

$ gcc define.c
$ ./a.out
2-----1
结论:

用的是指针类型无妨,若是实体类型将会报错



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页