Separate Declarations and Definitions
Separate Declarations and Definitions
A declaration tells another source file how to call a function; its definition provides the body.
A report project can separate its pass rule from main and link both compiled source files.
Before this lesson, review Check Behavior at Boundaries when needed.
What you’ll learn
- Use multi file programs to separate Declarations and Definitions.
- Explain how the complete example produces true.
- Make the practice change and explain why the result changes or stays the same.
Follow a complete C++ example
A report project can separate its pass rule from main and link both compiled source files.
Read the declarations above main before tracing its statements. Each declared name supplies the value, type or operation used later. The std:: prefix selects a name from the standard library, and cout << sends a value to the output stream.
C++17 · main.cpp · complete program
#include <iostream>
bool passed(int marks) {
return marks >= 50;
}
int main() {
std::cout << std::boolalpha << passed(72) << '\n';
return 0;
}
Expected output
trueRun in C++ compiler →Connect the code to its result
C++17 · source used in this explanation
#include <iostream>
bool passed(int marks) {
return marks >= 50;
}
int main() {
std::cout << std::boolalpha << passed(72) << '\n';
return 0;
}
Expected output
trueA declaration tells another source file how to call a function; its definition provides the body. A report project can separate its pass rule from main and link both compiled source files.
Trace the result: Read the complete program below from its starting values to the output operations. Each std::cout statement displays the value supplied at that point; \n begins the next line. The resulting lines, in order, are true. In this example, distinguish what the program calculates or changes from what it actually displays.
Build an actual three-file project
This project uses three real files. The header declares the function, the implementation defines it, and main calls it. Compile both .cpp files together; the header is included rather than compiled as a separate implementation.
school.hpp
#ifndef SCHOOL_HPP
#define SCHOOL_HPP
bool passed(int marks);
#endifschool.cpp
#include "school.hpp"
bool passed(int marks) { return marks >= 50; }main.cpp
#include <iostream>
#include "school.hpp"
int main() { std::cout << std::boolalpha << passed(72) << '\n'; }Build with clang++ -std=c++17 main.cpp school.cpp -o school. Running the result prints true. Omitting school.cpp leaves the function undefined and fails at the linking stage.
Optional CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(School LANGUAGES CXX)
add_executable(school main.cpp school.cpp)
target_compile_features(school PRIVATE cxx_std_17)With CMake installed, configure with cmake -S . -B build and build with cmake --build build. CMake organizes the build; it still requires a suitable C++ compiler.
Important mistakes and boundaries
Compile every required implementation file. Missing definitions produce linker errors; copying non-inline definitions into multiple translation units can also fail.
Change the school example
C++17 · edit this complete example
#include <iostream>
bool passed(int marks) {
return marks >= 50;
}
int main() {
std::cout << std::boolalpha << passed(72) << '\n';
return 0;
}
Your task: Use passed(40) in main. Before running your edited program, predict the new output and explain which stored value, condition or object changes. Keep the rest of the example intact.
Use the complete source repeated here; this task does not depend on remembering code from another section.
Worked answer and reasoning
Worked variation: Use passed(40) in main. The linked program prints false.
A declaration tells another source file how to call a function; its definition provides the body. A report project can separate its pass rule from main and link both compiled source files.
Compile every required implementation file. Missing definitions produce linker errors; copying non-inline definitions into multiple translation units can also fail.
For a baseline run, save this source as main.cpp and use clang++ -std=c++17 -Wall -Wextra -pedantic main.cpp -o school, or equivalent g++ flags. Recompile after editing so that you run the updated executable.
The source and output below belong to the edited program. Compare them with the original example to see the consequence of this single change.
C++17 · worked variation · complete program
#include <iostream>
bool passed(int marks) {
return marks >= 50;
}
int main() {
std::cout << std::boolalpha << passed(40) << '\n';
return 0;
}
Expected output
falseRun in C++ compiler →Check your understanding
C++17 · original program for this question
#include <iostream>
bool passed(int marks) {
return marks >= 50;
}
int main() {
std::cout << std::boolalpha << passed(72) << '\n';
return 0;
}
What to remember
A declaration tells another source file how to call a function; its definition provides the body. Compile every required implementation file. Missing definitions produce linker errors; copying non-inline definitions into multiple translation units can also fail.
Useful connections: Check Behavior at Boundaries, Give a Task a Name.
Language and design guidance: C++ Core Guidelines and C++ working draft. The draft describes an evolving language; these examples deliberately target C++17.
Reaching the recap and completing the quizzes are separate milestones.