您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-06 13:17 246 查看
原因:

由于看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
结论:

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐