g++如何解决警告"used but never defined"? (不是静态的或内联的)
g++ how to solve warning "used but never defined"? (not static or inline)
我遇到了一个我无法理解的奇怪的编译错误。首先,错误引用该函数,就好像它在匿名命名空间中一样,但实际上它在 namespace database
中。其次,"used but never defined" 语句表明编译需要我从 header 中定义函数。该函数实际上是在单独的实现文件中声明的。但是该函数既不是静态的也不是内联的,所以我不知道为什么它需要在 header 中定义。要求这段代码严格遵守,因此我编译了-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
问题是由于使用:
#ifndef database
#define database
之后,
namespace database { ...
被视为
namespace { ...
即匿名命名空间。
您需要使用不同的 include guard 宏,例如:
#ifndef database_hpp
#define database_hpp
我遇到了一个我无法理解的奇怪的编译错误。首先,错误引用该函数,就好像它在匿名命名空间中一样,但实际上它在 namespace database
中。其次,"used but never defined" 语句表明编译需要我从 header 中定义函数。该函数实际上是在单独的实现文件中声明的。但是该函数既不是静态的也不是内联的,所以我不知道为什么它需要在 header 中定义。要求这段代码严格遵守,因此我编译了-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
问题是由于使用:
#ifndef database
#define database
之后,
namespace database { ...
被视为
namespace { ...
即匿名命名空间。
您需要使用不同的 include guard 宏,例如:
#ifndef database_hpp
#define database_hpp