C++ c++;为什么不总是需要定义静态成员?

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

我读过这篇文章(关于undefined-reference-to-a-static-member),但从我所看到的来看,我并不总是要求在cpp中定义静态成员。所以我请求帮助理解规则

几个示例-cpp中没有def的所有示例。 在h文件中,类主声明为:

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成员必须在其中一个翻译单元中定义。我发誓它是:)。我刚刚做了一个演示。前面有参数,前面没有参数。无论如何我都要声明。非常感谢!!!!