包括不起作用的警卫
include guards not working
我已经定义了一个util.h文件,该文件具有我想在其他几个其他文件中使用的函数。该标头具有包含的罩,但是当我在两个不同的文件中使用它时,我会收到一个multiple definition of...
错误。我在做什么错?
我已经阅读了这篇文章,但这与可变声明/定义有关。这个答案似乎更相关,但我不清楚如何解决此问题。
// util.h
// include lots of standard headers
#include ...
#ifndef UTIL_H
#define UTIL_H
using namespace std;
// multiple definition of `randarr(int, int, int)`
int* randarr(int size, int min, int max) {
int *ret = new int[size];
for (int i=0; i<size; i++)
ret[i] = (int) (((double) rand() / RAND_MAX) * max) + min;
return ret;
}
// no error
template<typename T> void printarr(T* v, int begin, int end) {
for (int i=begin; i<end; i++)
cout << v[i] << " ";
cout << endl;
}
// multiple definition of `is_prime(int)`
bool is_prime(int n) {
if (n == 2 || n == 3 || n == 5) return true;
if (n <= 1 || (n&1) == 0) return false;
for (int i = 3; i*i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
#endif
// example.cpp
#include ...// lots of standard includes
#include "util.h"
void f() {
randarr(...);
printarr(...);
is_prime(...);
...
}
// Main.cpp
#include "util.h"
int main() {
}
包括后卫不是造成错误的原因;您违反了一个定义规则。由于 util.h 都包含在2个源文件中,因此预处理后每个源文件后创建的翻译单元将包含每个函数的定义,从而导致多个定义错误。
要摆脱错误,请标记功能inline
inline int* randarr(int size, int min, int max) {
// ...
}
template<typename T>
inline void printarr(T* v, int begin, int end) {
// ...
}
inline bool is_prime(int n) {
// ...
}
您正在获得链接器错误,而不是编译器错误。您已经在util.h
文件中实现了randarr()
的函数,这意味着编译器在example.cpp
和Main.cpp
中的每个文件中都看到randarr()
的副本。当链接器将它们链接在一起时,它会抱怨,因为您不允许使用相同功能的一个以上的定义。
您有两个选择:
- 将
randarr()
声明为标题文件中的inline
- 将
randarr()
的定义移至util.cpp
文件
将相同的修复程序应用于is_prime()
。
您在标题文件中定义了功能。这意味着,这些功能的代码都包含在example.cpp
和Main.cpp
中。这也意味着代码将生成两次。这就是"多重定义"的原因。错误。
当您在单独的util.cpp
中仅定义函数randarr()
和is_prime()
时,错误将消失。
您的标题应仅包含功能的原型。一个原型将您的功能描述到其他文件,但不能实现它。唯一的例外是模板,因为每个模板专业化都是在编译时间上建立的。
如果您在标题文件中实现函数,在链接器时间,您会多次找到功能内容,这就是为什么您要面对错误。
将randarr
和is_prime
的实现移动到另一个文件,然后将您util.h转换为:
#ifndef UTIL_H
#define UTIL_H
using namespace std;
int* randarr(int size, int min, int max);
template<typename T> void printarr(T* v, int begin, int end) {
for (int i=begin; i<end; i++)
cout << v[i] << " ";
cout << endl;
}
bool is_prime(int n);
#endif
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 包括在 <sstream> Xcode 9.2 中不起作用
- 包括不起作用C 的文件
- 包括不起作用的警卫
- C++包括警卫似乎不起作用?
- PCL 包括卷积不起作用