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

Posted Ijuan_0712

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用某类型是否用声明的思考相关的知识,希望对你有一定的参考价值。

原因:

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

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




以上是关于使用某类型是否用声明的思考的主要内容,如果未能解决你的问题,请参考以下文章

定义方法需要思考的三点

在Java中,如何检测一个数组中是不是包含某一个数据?

每日思考(2020/01/16)

Java泛型理解

构造函数

shell脚本编程测试类型上