规避makefile中重复库头和typedef的方法

时间:2019-03-22 07:54:53

标签: c++ include

背景

说我有这种文件结构:

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

我想使用Makefile进行编译,并将生成的目标文件保存在build文件夹中。这些文件的内容如下:

制作文件

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 个答案:

答案 0 :(得分:3)

头文件的要点是,您可以在每个源文件中include #include "FunctionLinker.h"头文件,它们需要一些重复的代码行。因此,如果您在所有源文件中添加{{1}},则可以删除多余的代码行。

请注意,这与makefile无关。问题和解决方案在您的c ++代码中。