C++ c++;为什么不总是需要定义静态成员?
我读过这篇文章(关于undefined-reference-to-a-static-member),但从我所看到的来看,我并不总是要求在cpp中定义静态成员。所以我请求帮助理解规则 几个示例-cpp中没有def的所有示例。 在h文件中,类主声明为:C++ c++;为什么不总是需要定义静态成员?,c++,C++,我读过这篇文章(关于undefined-reference-to-a-static-member),但从我所看到的来看,我并不总是要求在cpp中定义静态成员。所以我请求帮助理解规则 几个示例-cpp中没有def的所有示例。 在h文件中,类主声明为: class Master{ public: static IDataSynchronization& sync_data_cb_; } void Master::start(IDataSynchronization& syn
class Master{
public:
static IDataSynchronization& sync_data_cb_;
}
void Master::start(IDataSynchronization& syncDataCB); - error for undefined
void Master::start(int p,IDataSynchronization& syncDataCB); no error
在cpp中:
class Master{
public:
static IDataSynchronization& sync_data_cb_;
}
void Master::start(IDataSynchronization& syncDataCB); - error for undefined
void Master::start(int p,IDataSynchronization& syncDataCB); no error
//这里是在静态同步数据中使用的_
void Master::sendData(){
list data=sync_data_cb_.syncData();
列表::迭代器;
for(it=data.begin();it!=data.end();+it){
发送到(实例->数据->套接字->fd-(*it).c\u str(),(*it).length(),0,(const struct sockaddr*)和实例->目标->主机->数据-,实例->sockadd\u长度)
对于该类:
class Logger {
public:
static void Log(const char *format, ...);
private:
static FILE* file_;
static mutex mtx_;
};
如果在我声明静态文件*(并在类方法中使用)的另一个类中,我不会因为未定义它而得到错误
我在所有情况下都在这些静态内存中使用。
有人能帮我清理房间吗
谢谢与其他许多东西一样,只需要定义实际使用的符号(C++11术语中使用的odr)
您可以为您需要的更多内容提供声明,只要不使用它们,您就不需要定义。与许多其他内容一样,只需要定义实际使用的符号(C++11术语中使用的odr)
你可以为你需要的更多东西做声明,只要不使用它们,你就不需要定义。规则说如果你使用它,你需要一个
syncDataCB
的定义。“如果你使用它”在形式上有不同的定义,但这足以让人理解
但是,如果您在没有定义的情况下使用它,编译器/链接器就不需要给出错误。实际上,这意味着如果您将sync\u data\u cb\u
传递到start
,但不在那里使用syncDataCB
,如果start
内联,则不会出现错误,如果它没有内联,则会出现错误
您不会总是收到错误消息这一事实与此无关,它并不意味着代码有时是正确的。如果您使用
sync\u data\u cb\u
,您需要一个定义。规则说,如果您使用它,您需要定义syncDataCB
。“如果您使用它”在形式上有不同的定义,但这已经足够让人理解了
但是,如果您在没有定义的情况下使用它,编译器/链接器就不需要给出错误。实际上,这意味着如果您将sync\u data\u cb\u
传递到start
,但不在那里使用syncDataCB
,如果start
内联,则不会出现错误,如果它没有内联,则会出现错误
您不会总是收到错误消息这一事实与此无关,它并不意味着代码有时是正确的。如果您使用
sync\u data\u cb\u
,您需要一个定义。Master::start函数与sync\u data\u cb\u
定义有什么关系?可能是您没有使用file\u
变量可编译?你是指编译还是编译和链接?因为编译器并不真正关心,因为它不知道它是否在别处定义。代码void Master::start(…)
行甚至无法编译。花点时间在问题中编写完整的功能代码。只要你不清楚你需要什么,你就不会得到好的答案。Master::start
函数与sync\u data\u cb\u
定义有什么关系?可能是你没有使用file\uuz
变量吗?你知道吗你是说编译还是编译和链接?因为编译器并不真正关心,因为它不知道它是否在别处定义。代码void Master::start(…)
行甚至无法编译。花点时间在问题中编写完整的功能代码。只要你不清楚你需要什么,你就不会得到好的答案。@user1495181:你没有真正展示整个程序,标准中对use的含义有一个精确的定义。这个问题陈述得很糟糕,因为声明选项不清楚(您正在隐藏上下文--class)这里没有显示任何用途。无论如何,标准非常明确,odr使用的每个符号都必须在程序中定义。发布一个最小的完整程序,如果您愿意,我们可以讨论它。我不相信编译和链接在其中一个翻译单元中没有任何定义。这是对成员的使用,因此e成员必须在其中一个翻译单元中定义。我发誓它是:)。我刚刚做了一个演示。前面有参数,前面没有参数。无论如何我都要声明。非常感谢!!@user1495181:你并没有真正展示整个程序,标准中有一个关于使用含义的精确定义。问题是我因为声明不清楚(您正在隐藏上下文--class),所以声明很糟糕这里没有显示任何用途。无论如何,标准非常明确,odr使用的每个符号都必须在程序中定义。发布一个最小的完整程序,如果您愿意,我们可以讨论它。我不相信编译和链接在其中一个翻译单元中没有任何定义。这是对成员的使用,因此e成员必须在其中一个翻译单元中定义。我发誓它是:)。我刚刚做了一个演示。前面有参数,前面没有参数。无论如何我都要声明。非常感谢!!!!