c - C编程中前向声明的意义是什么?

标签 c forward-declaration

我现在正在通过 Zed A. Shaw 的 Learn C the Hard Way 学习 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;
}

难道我们不能像这样编写代码(将 can_print_itprint_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");
}

真的有前向声明很重要且不可避免的时候吗?

最佳答案

只要你的调用图是循环的,函数的前向声明是不可避免的;也就是说,只要您在函数之间进行(直接或间接)递归。

如果您想将程序分成多个翻译单元,它们很有用,因为它们允许分离函数的声明和定义(将声明放在 .h header 和 .c 文件中的定义)。

关于c - C编程中前向声明的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084608/

相关文章:

更改 wav 文件的采样率和比特率而不会遇到打开文件的问题?

c++ - 前向声明和命名空间 (c++)

c++ - 变量的不完整类型 - 虽然我认为我已经正确声明了前向?

c - JNI : call to a function where memset happens causes jvm-fetch to crash in the second call

c++ - 前向声明?包括守卫?或其他什么?

c++ - C++创建头文件时,多个重载函数实例与参数列表匹配

c++ - 函数的前向声明搞砸了,说 args 是未声明的标识符

python - 用 C 解释来自 Modbus ASCII 的数据

C语言->读取文件到动态数组

编译器不显示显式转换的警告消息