【问题标题】:What is a clean way to have function1 call function2 and have function2 call function1?让function1调用function2并让function2调用function1的干净方法是什么?
【发布时间】:2018-04-03 08:47:53
【问题描述】:

我的问题是关于递归的,但比典型情况稍微复杂一些。通常,递归函数会调用自身:

int functionName(int x) {
    if (x meets condition) {
        return x;
    }
    else {
        x = functionName(x)
    } 
}

但是,我有两个函数:functionAfunctionB。我想让functionA 打电话给functionBfunctionB 打电话给functionA

int functionA(int x) {
    if (x meets condition) {
        return x;
    }
    else {
        x = functionB(x)
    } 
}

int functionB(int x) {
    if (x meets condition) {
        return x;
    }
    else {
        x = functionA(x)
    } 
}

这里有个悖论,functionA需要在functionB之前定义,而functionB需要在functionA之前定义。

大概,如果我们有函数原型出现在函数定义之前,我们应该没问题:

int functionA(int x); // PROTOTYPE
int functionB(int x); // PROTOTYPE

// [insert definition of functionA here]
// [insert definition of functionB here]

然而,这些密不可分的过程相当复杂。如果我们将两个函数放在同一个文件中,我们将得到我所说的“文字墙效果”。该文件将相当长且难以阅读。我很想把这两个不同的函数放到两个不同的文件中。但是,如果我这样做,我不确定如何处理 #include 语句和头文件。如果文件function2.c 有一个#include function1.h 并且function1.c 有一个#include function2.h,这似乎是一种循环。

【问题讨论】:

  • 如果你已经声明了函数原型,那就没有悖论了。我不明白你的“代码墙”言论,以及为什么要将函数分成不同的文件,使代码更难阅读。
  • else 子句也必须返回一个值。
  • 没有悖论,但您可能需要重新考虑设计并将这两个功能合二为一,或者重新构造它们以避免循环引用。

标签: c function include header-files definition


【解决方案1】:

只需将包含保护放在标题中,并将其包含在您需要的所有 .c 文件中:

// header.h
#ifndef HEADER_H
#define HEADER_H

int functionA(int x); // PROTOTYPE
int functionB(int x); // PROTOTYPE

#endif

或者干脆用这个:

#pragma once

int functionA(int x); // PROTOTYPE
int functionB(int x); // PROTOTYPE

以后你可以在file1.cfile2.c...file100.c等中做#include "header.h",不会有任何冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多