我之前已经问过类似的问题,但这个有点不同。
我不想为每个简单的C++类编写一个.cpp文件。
当我在单个.hpp文件中编写类定义和声明时,链接器会抱怨成员函数的多次定义,这些成员函数没有在类体内实现或者使用了inline关键字进行定义。
例如,以下代码可以工作,但成员函数将变为inline:
// log.hpp file
#pragma once
#include<iostream>
class log {
private:
static int m_cnt = 0;
public:
void log();
};
inline void log::log() {
std::cout << ++m_cnt << std::endl;
}
所以,我使用模板来消除连接器的投诉,并希望成员函数不变为内联函数(它们会吗?)
// log.hpp file
#pragma once
#include<iostream>
template<typename T>
class log_t {
private:
static int m_cnt = 0;
public:
void log();
};
template<typename T>
void log_t<T>::log() {
std::cout << ++m_cnt << std::endl;
}
// some random type (int)
typedef log_t<int> log;
然后我可以在多个.cpp文件中简单地使用log类,而不会有链接器的投诉。
即使我使用这种方法,成员函数是否会变成内联函数?
inline
不仅仅是指令,而是一种提示/注释。编译器会自行决定是否进行内联。有时候,在某些调用位置可以进行函数内联,而在其他位置则不能,只需让编译器完成其工作即可。您可以使用-Os
进行编译以减少内联。 - Antoine