乘法定义的函数
单一定义规则最重要的结果是,具有外部链接的非内联函数应该只在程序中定义一次,尽管它们可以多次声明。因此,不应在标题中定义这样的函数,因为可以从不同的翻译单元多次包括标题。
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.cpp
和 main.cpp
都分别包括 foo.h
。尝试构建此程序的最可能结果是链接时错误,将 foo
标识为已经多次定义。
为了避免这样的错误,应该在头文件中声明函数并在相应的 .cpp
文件中定义它们,但有一些例外(参见其他示例)。