CS253: Software Development with C++

Spring 2018

Separate Compilation

See this page as a slide show

CS253 Separate Compilation

Separate Compilation

It’s often useful to separate the class interface (*.h) from the class implementation (*.cc).

Example

Foo.h Foo.cc
#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED

#include <iostream>

class Foo {
  public:
    Foo();
    int get_data() const;
  private:
    double data;
};

std::ostream & operator<<(std::ostream &,
			  const Foo &);

#endif /* FOO_H_INCLUDED */
#include "Foo.h"

using namespace std;

Foo::Foo() : data(42.0) {
}

int Foo::get_data() const {
    return data;
}

ostream &operator<<(ostream &os,
		    const Foo &f) {
    return os << f.get_data();
}

Contents

The *.h file only contains the method declarations (signatures), function declarations (for non-member functions & operators) and declarations of data members. The *.cc file contains the actual code for the methods and functions. Neither one contains main.

Why?

Typing

“But it’s more typing!”

If you’re afraid of typing, then you have certainly chosen the wrong profession, and the wrong century to live in.

Compilation

Compile the code like this:

    g++ -Wall main.cc Foo.cc

Note that you should not compile the *.h file. That will result in a *.gch (compiled header) file, which will cause no end of trouble. Remove it if you ever find it.

If you do this with a Makefile, make sure to have main.cc also depend upon Foo.h. After all, if you change Foo.h (say, by adding a member variable) then you must recompile main.cc, because the size of Foo has changed.

User: Guest

Check: HTML CSS
Edit History Source

Modified: 2018-04-24T16:55

Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA
© 2018 Colorado State University
CS Building