当前位置: 技术问答>linux和unix
C关于函数的申明的疑惑?
来源: 互联网 发布时间:2016-03-30
本文导语: extern int Svrinitfunc _(( int, char ** )); extern int Svrtranfunc _(( int )); extern int SvrtranfuncA _(( int,int )); extern void Svrdonefunc _(( void )); extern int bcl_send_fileds _(( int , int , void *, int )); extern int bcl_tcp_accept _(( ...
extern int Svrinitfunc _(( int, char ** ));
extern int Svrtranfunc _(( int ));
extern int SvrtranfuncA _(( int,int ));
extern void Svrdonefunc _(( void ));
extern int bcl_send_fileds _(( int , int , void *, int ));
extern int bcl_tcp_accept _(( int,u_int *,u_short * ));
extern void bcl_sig_add_blkmask _(( int )) ;
extern int DTASvrInitByInstId _(( char *,int ,char **,int ));
int bcl_bytesreadable _(( int ));
Sigfunc bcl_sig_sethandler _(( int , Sigfunc ));
static int start_one _(( int ));
static int restart_one _(( pid_t, int ));
static void clear_conn_array _(( int ));
static int asyn_start_one _((int,int));
static int get_max_all_conn _(( void ));
请大虾们看清函数特征,我不明白的是,为什么要在函数名后加以空格,然后紧接低划线。
至于extern,static的说明请省略。
extern int Svrtranfunc _(( int ));
extern int SvrtranfuncA _(( int,int ));
extern void Svrdonefunc _(( void ));
extern int bcl_send_fileds _(( int , int , void *, int ));
extern int bcl_tcp_accept _(( int,u_int *,u_short * ));
extern void bcl_sig_add_blkmask _(( int )) ;
extern int DTASvrInitByInstId _(( char *,int ,char **,int ));
int bcl_bytesreadable _(( int ));
Sigfunc bcl_sig_sethandler _(( int , Sigfunc ));
static int start_one _(( int ));
static int restart_one _(( pid_t, int ));
static void clear_conn_array _(( int ));
static int asyn_start_one _((int,int));
static int get_max_all_conn _(( void ));
请大虾们看清函数特征,我不明白的是,为什么要在函数名后加以空格,然后紧接低划线。
至于extern,static的说明请省略。
|
用于兼容K&R的函数声明
K&R的函数声明只需要:
int fclose();
ANSI的函数声明要求:
int fclose(FILE *);
一般的用法:
K&R的函数声明只需要:
int fclose();
ANSI的函数声明要求:
int fclose(FILE *);
一般的用法:
#ifndef __P
#if (__STDC__-0) ¦ ¦ defined (__cplusplus)
#define __P(x) x
#else
#define __P(x) ()
#endif
#endif
void clearerr __P((FILE *));
int fclose __P((FILE *));
int feof __P((FILE *));
int ferror __P((FILE *));
int fflush __P((FILE *));
int fgetc __P((FILE *));
int fgetpos __P((FILE *, fpos_t *));
char *fgets __P((char *, size_t, FILE *));
|
用于兼容K&R的函数声明
K&R的函数声明只需要:
int fclose();
ANSI的函数声明要求:
int fclose(FILE *);
一般的用法:
K&R的函数声明只需要:
int fclose();
ANSI的函数声明要求:
int fclose(FILE *);
一般的用法:
#ifndef __P
#if (__STDC__-0) || defined (__cplusplus)
#define __P(x) x
#else
#define __P(x) ()
#endif
#endif
void clearerr __P((FILE *));
int fclose __P((FILE *));
int feof __P((FILE *));
int ferror __P((FILE *));
int fflush __P((FILE *));
int fgetc __P((FILE *));
int fgetpos __P((FILE *, fpos_t *));
char *fgets __P((char *, size_t, FILE *));
|
哪个文献?
最权威的就是C语法的lex和yacc表示,没有任何迹象表明后面不可以有空格。
|
_() 是一个宏定义,这样写是为了跨平台用的
|
替换后,函数名与形参之间有空格不会影响,符合语法规则。
|
那后面有空格就是特殊的函数规则,不是一般的函数规则。呵呵
你可以自己写一个为函数试试,看看语法正确不正确,编译能不能通过。
|
编译成汇编码后一模一样。
$ cat x.c
#include
int foo(void);
int
main(void)
{
return 0;
}
int
foo(void)
{
return 0;
}
$ cat y.c
#include
int foo /* foo */ ( void );
int
main(void)
{
return 0;
}
int /* foo */ foo(void)
{
return 0;
}
$ cc -S x.c y.c
$ diff x.s y.s
1c1
.file "y.c"
$