Два файла, использующие друг друга по функциям - как это решить? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть два заголовка с исходными файлами, скажем, file1.h, file1.cc и file2.h, file2.cc. Они используют функции друг друга, например:

file1.h:

void test1();

file2.h:

void test2();

file1.cc:

#include "file1.h"
#include "file2.h"

void test1() {
  do_something();
  test2();
}

file2.cc:

#include "file1.h"
#include "file2.h"

void test2() {
  do_something_else();
  test1();
}

У меня проблема, зависимость взаимная, и мы не можем скомпилировать один файл без компиляции другого. Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018
  1. Измените файлы, чтобы удалить двойную рекурсию.
  2. Используйте некоторый код для предотвращения двойного включения ваших .h файлов (я использовал #pragma once вверху .h файлов)
  3. опционально, добавьте main.cpp для вызова функций
  4. укажите код для do_something ()
  5. скомпилировать используя. g++ *.cpp -o main

Отличный вопрос!

Вот файлы:

// main.cpp
//

#include <iostream>

#include "file1.h"
#include "file2.h"

int main() {

    test2();
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

// file1.cpp

#include "file1.h"
#include "file2.h"
#include <iostream>

void do_something() {
    std::cout << "Just hit do_something" << std::endl;
}
void test1() {
    do_something();
//    test2();  // Do not use double recursion.
}

// file1.h

#pragma once

void do_something();
void test1();

// file2.cpp

#include "file1.h"
#include "file2.h"

void test2() {
    do_something();
    test1();
}

// file2.h

#pragma once

void test2();
0 голосов
/ 31 октября 2018

Лучший ответ: не создавайте свой код таким образом! Это вводит " циклическую зависимость ", которая немедленно делает ваш код хрупким. Кроме того, способ, которым вы написали свой пример, описывает двойную рекурсивную функцию (A вызывает B, которая вызывает A), и, поскольку нет завершающего условия, оно не ограничено! Как видите, это может привести к очень неуправляемым обстоятельствам.

Давайте на время отказаться от хороших инженерных практик. То, как вы описали заголовки и исходные файлы, является адекватным и может быть построено с помощью следующей команды:

g++ file1.cc file2.cc -o libCoupledRecursiveExample.so

Здесь все становится сложнее: только с помощью инструкций по сборке вы не можете обнаружить зависимость! Хорошие средства проверки статического кода могут обнаружить эти обстоятельства и предупредить вас, но когда вы используете ленивый компилятор (например, g++ без флагов), легко подобрать код, подобный этому, который не будет генерировать никаких предупреждений.

...