g ++如何解决“已使用但未定义”的警告? (不是静态或内联)

时间:2016-02-20 05:11:37

标签: c++ namespaces g++

我遇到了一个奇怪的编译错误,我无法理解。首先,错误引用的函数就像它在匿名命名空间中一样,但它实际上在namespace database内。其次,“使用但从未定义”语句表明编译需要我在头文件中定义函数。事实上,该函数在单独的实现文件中声明。但是这个函数既不是静态函数也不是内联函数,所以我不知道为什么它需要在头文件中定义。要求这段代码严格遵守,因此我使用-Wall -Werror进行了编译。我还提供了一个缩短版的源代码以供澄清。

注意:此问题与此处提出的其他类似问题的不同之处在于它不涉及静态或内联函数。

错误:

In file included from src/main.cpp:6:0:
include/database.hpp:19:6: error: 'void {anonymous}::SetupSettings()' used but never defined [-Werror]
 void SetupSettings();
      ^
cc1plus.exe: all warnings being treated as errors

的main.cpp

#include <iostream>
#include "config.hpp"
#include "database.hpp"

int main() {
  database::SetupSettings();
  return 0;
}

database.hpp

#ifndef database
#define database
#include <iostream>
#include "config.hpp"
#include "sqlite/sqlite3.h"

namespace database {
extern sqlite3* settings_database;

void SetupSettings();
//   ^^ Apparent warning here.
}  // namespace database
#endif

database.cpp:

#include <iostream>
#include <vector>
#include "config.hpp"
#include "database.hpp"
#include "sqlite/sqlite3.h"

namespace database {
sqlite3* settings_database;

void SetupSettings() {/*More code here*/}
}  // namespace database

1 个答案:

答案 0 :(得分:5)

问题是由使用:

引起的
#ifndef database
#define database

之后,

namespace database { ...

被视为

namespace { ...

即。匿名命名空间。

您需要使用不同的包含保护宏,例如:

#ifndef database_hpp
#define database_hpp