Hil*_*man 10 c forward-declaration
我现在通过Zed A. Shaw的"学习C艰难之路"学习C编程.有这个代码(取自他的网站):
#include <stdio.h>
#include <ctype.h>
// forward declarations
int can_print_it(char ch);
void print_letters(char arg[]);
void print_arguments(int argc, char *argv[])
{
int i = 0;
for(i = 0; i < argc; i++) {
print_letters(argv[i]);
}
}
void print_letters(char arg[])
{
int i = 0;
for(i = 0; arg[i] != '\0'; i++) {
char ch = arg[i];
if(can_print_it(ch)) {
printf("'%c' == %d ", ch, ch);
}
}
printf("\n");
}
int can_print_it(char ch)
{
return isalpha(ch) || isblank(ch);
}
int main(int argc, char *argv[])
{
print_arguments(argc, argv);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们不能像这样编码(将can_print_it和print_letters函数放在顶部并删除前向声明的需要):
#include <stdio.h>
#include <ctype.h>
int can_print_it(char ch)
{
return isalpha(ch) || isblank(ch);
}
void print_letters(char arg[])
{
int i = 0;
for(i = 0; arg[i] != '\0'; i++) {
char ch = arg[i];
if(can_print_it(ch)) {
printf("'%c' == %d ", ch, ch);
}
}
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
是否有时候前瞻性声明很重要且不可避免?
eca*_*mur 10
只要您的调用图是循环的,函数的前向声明就是不可避免的; 也就是说,每当你在函数之间进行(直接或间接)递归时.
如果要将程序分成多个转换单元,它们很有用,因为它们允许分离声明和函数定义(将声明放在.h标题中,将定义放在.c文件中).
C中函数的前向声明通常有两种不同的用法.
导出函数的标头在头文件中声明,该头文件包含在客户端模块中.
在相互递归中,两个函数重复相互调用.如果没有前瞻性声明,则两个函数中的一个将在另一个函数的主体中未声明.
例:
int Odd(int n);
int Even(int n)
{
return (n == 0)? 1: Odd(n - 1);
}
int Odd(int n)
{
return (n == 0)? 0: Even(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
使用函数指针,我们可以不使用前向声明:
int (*odd)(int n);
int Even(int n)
{
return (n == 0)? 1: odd(n - 1);
}
int Odd(int n)
{
return (n == 0)? 0: Even(n - 1);
}
void Init(void)
{
odd = Odd;
...
}
Run Code Online (Sandbox Code Playgroud)