0

我读了这篇好文章(关于 undefined-reference-to-a-static-member),但据我所知,我并不总是需要在 cpp 中定义静态成员。所以我寻求帮助以了解规则。

几个例子——cpp中没有def的所有例子。在类 Master 声明的 h 文件中是:

class Master{
public:
    static IDataSynchronization& sync_data_cb_;
}

在 cpp 中:

void Master::start(IDataSynchronization& syncDataCB);   - error for undefined
void Master::start(int p,IDataSynchronization& syncDataCB);  no error

//这里用在静态sync_data_cb_ void Master::sendData(){ list data = sync_data_cb_.syncData(); list::iterator it; for (it = data.begin(); it != data.end(); ++it) { sendto(instance_->data_sock_fd_, (*it).c_str(), (*it).length(), 0 ,(const struct sockaddr *) &instance_->target_host_data_, instance_->sockadd_length_);

    }
}

对于这个类:

class Logger {
public:
    static void Log(const char *format, ...);
private:
    static FILE* file_;
    static mutex mtx_;
};

如果在我声明静态静态文件*(并在类方法中使用它)的另一个类中,我不会因为未定义而收到错误。

在所有情况下,我都在这些静态成员中使用。

任何人都可以为我清除规则吗?

谢谢

4

2 回答 2

4

规则说您需要定义syncDataCB是否使用它。“如果你使用它”在形式上的定义不同,但这已经足够接近理解了。

但是,如果您确实在没有定义的情况下使用它,则编译器/链接器不需要给出错误。在实践中,这意味着如果你传递sync_data_cb_start,但不在syncDataCB那里使用,如果被内联,你将不会收到错误start,但如果没有的话。

您不会总是收到错误消息这一事实并不相关,这并不意味着代码有时是正确的。如果你使用sync_data_cb_,你需要一个定义。

于 2012-10-04T14:22:08.597 回答
0

与许多其他事物一样,只需要定义实际使用的符号( C++11 中的odr-used )。

您可以声明更多您需要的东西,只要不使用它们,您就不需要定义。

于 2012-10-04T14:19:32.170 回答