乘法定义的函数

单一定义规则最重要的结果是,具有外部链接的非内联函数应该只在程序中定义一次,尽管它们可以多次声明。因此,不应在标题中定义这样的函数,因为可以从不同的翻译单元多次包括标题。

foo.h

#ifndef FOO_H
#define FOO_H
#include <iostream>
void foo() { std::cout << "foo"; }
void bar();
#endif

foo.cpp

#include "foo.h"
void bar() { std:: cout << "bar"; }

main.cpp

#include "foo.h"
int main() {
    foo();
    bar();
}

在这个程序中,函数 foo 在头文件 foo.h 中定义,它包含两次:一次来自 foo.cpp,一次来自 main.cpp。因此,每个翻译单元都包含自己对 foo 的定义。请注意,在 foo.h 的包括防护装置不防止这种情况发生,因为 foo.cppmain.cpp分别包括 foo.h。尝试构建此程序的最可能结果是链接时错误,将 foo 标识为已经多次定义。

为了避免这样的错误,应该在头文件中声明函数并在相应的 .cpp 文件中定义它们,但有一些例外(参见其他示例)。