Способ уклонения от повторяющихся заголовков библиотеки и typedef в makefile - PullRequest
1 голос
/ 22 марта 2019

обои

Скажите, у меня есть такая структура файлов:

|Makefile
|build
|source
|-FunctionLinker.h
|-main.cpp
|-A.cpp
|-B.cpp
|-C.cpp

, где я хотел бы скомпилировать, используя Makefile и сохранить полученные целевые файлы в папке build. Содержимое этих файлов выглядит следующим образом:

Makefile

CXX = g++ -std=c++11
CXXFLAGS = -c -Wall

OBJS = build/main.o build/A.o build/B.o build/C.o
all: Project
Project: $(OBJS)
    $(CXX) -o $@ $(OBJS)

build/%.o: source/%.cpp
    $(CXX) -o $@ $(CXXFLAGS) $<

main.cpp

#include <iostream>
#include <vector>
#include "FunctionLinker.h"

int main(){
    Vector ExampleVector = {1,2};
    Matrix ExampleMatrix = {{1,2},{3,4}};

    A(ExampleVector, ExampleMatrix); // which is void
    B(ExampleVector, ExampleMatrix); // which is also void
    VectorMatrix Res = C(ExampleVector, ExampleMatrix); // which returns struct

    for (int i=0; i<2; i++){
        std::cout << Res.Vector[i] << '\t'
    }
}

A.cpp ( B.cpp почти аналогично)

#include <iostream>
#include <vector>

typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;

void A(Matrix& A, Vector& b){
    Some calculations...
}

C.cpp

#include <iostream>
#include <vector>

typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;

VectorMatrix C(Matrix& A, Vector& b){
    Some calculations...
}

FunctionLinker.h

#ifndef FUNCTIONLINKER.H
#define FUNCTIONLINKER.H

#include <iostream>
#include <vector>

typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;

struct VectorMatrix{ 
    Vector Vector;
    Matrix Matrix;
}; // I defined a struct here to allow a function to return multiple types

void A(Matrix A, Vector b);
void B(Matrix A, Vector b);
VectorMatrix C(Matrix A, Vector b);

#endif

Проблемы

Так что Makefile отлично работает, но я сомневаюсь, что это самая эффективная практика. Потому что следующие коды

#include <iostream>
#include <vector>

и

typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;

довольно избыточны, поэтому я хотел бы найти более "лаконичный" способ выполнения практики. Любая помощь будет оценена.

1 Ответ

3 голосов
/ 22 марта 2019

Смысл заголовочных файлов в том, что вы можете include использовать их в каждом исходном файле, для которого требуется несколько повторяющихся строк кода. Поэтому, если вы добавите #include "FunctionLinker.h" во все ваши исходные файлы, вы можете удалить лишние строки кода.

Обратите внимание, что это не имеет ничего общего с make-файлом. Проблема и решение находятся в вашем коде c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...