遇到一個很古怪的問題,C++類static const成員的初始化


在我的文件里有這class NFDuration, NFDuration.h里是這樣的:

 

// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
class NFDuration
{
public:
    static const int64_t kNanosecond; // = 1LL
    static const int64_t kMicrosecond;// = 1000
    static const int64_t kMillisecond;// = 1000 * kMicrosecond
    static const int64_t kSecond; // = 1000 * kMillisecond
    static const int64_t kMinute; // = 60 * kSecond
    static const int64_t kHour; // = 60 * kMinute
public:
    NFDuration();
    explicit NFDuration(const struct timeval& t);
    explicit NFDuration(int64_t nanoseconds);
    explicit NFDuration(int nanoseconds);
    explicit NFDuration(double seconds);

    // Nanoseconds returns the duration as an integer nanosecond count.
    int64_t Nanoseconds() const;

    // These methods return double because the dominant
    // use case is for printing a floating point number like 1.5s, and
    // a truncation to integer would make them not useful in those cases.

    // Seconds returns the duration as a floating point number of seconds.
    double Seconds() const;

    double Milliseconds() const;
    double Microseconds() const;
    double Minutes() const;
    double Hours() const;

    struct timeval TimeVal() const;
    void To(struct timeval* t) const;

    bool IsZero() const;
    bool operator<(const NFDuration& rhs) const;
    bool operator<=(const NFDuration& rhs) const;
    bool operator>(const NFDuration& rhs) const;
    bool operator>=(const NFDuration& rhs) const;
    bool operator==(const NFDuration& rhs) const;

    NFDuration operator+=(const NFDuration& rhs);
    NFDuration operator-=(const NFDuration& rhs);
    NFDuration operator*=(int ns);
    NFDuration operator/=(int ns);

private:
    int64_t ns_; // nanoseconds
};

#include "NFDuration.in.h"

 

 在NFDuration.in.h里

#pragma once

inline NFDuration::NFDuration()
    : ns_(0)
{
}

inline NFDuration::NFDuration(const struct timeval& t)
    : ns_(t.tv_sec * kSecond + t.tv_usec * kMicrosecond)
{
}

inline NFDuration::NFDuration(int64_t nanoseconds)
    : ns_(nanoseconds)
{
}

inline NFDuration::NFDuration(int nanoseconds)
    : ns_(nanoseconds)
{
}

inline NFDuration::NFDuration(double seconds)
    : ns_((int64_t)(seconds * kSecond))
{
}

inline int64_t NFDuration::Nanoseconds() const
{
    return ns_;
}

inline double NFDuration::Seconds() const
{
    return double(ns_) / kSecond;
}

inline double NFDuration::Milliseconds() const
{
    return double(ns_) / kMillisecond;
}

inline double NFDuration::Microseconds() const
{
    return double(ns_) / kMicrosecond;
}

inline double NFDuration::Minutes() const
{
    return double(ns_) / kMinute;
}

inline double NFDuration::Hours() const
{
    return double(ns_) / kHour;
}

inline bool NFDuration::IsZero() const
{
    return ns_ == 0;
}

inline struct timeval NFDuration::TimeVal() const
{
    struct timeval t;
    To(&t);
    return t;
}

inline void NFDuration::To(struct timeval* t) const
{
    t->tv_sec = (long)(ns_ / kSecond);
    t->tv_usec = (long)(ns_ % kSecond) / (long)kMicrosecond;
}

inline bool NFDuration::operator<(const NFDuration& rhs) const
{
    return ns_ < rhs.ns_;
}

inline bool NFDuration::operator<=(const NFDuration& rhs) const
{
    return ns_ <= rhs.ns_;
}

inline bool NFDuration::operator>(const NFDuration& rhs) const
{
    return ns_ > rhs.ns_;
}

inline bool NFDuration::operator>=(const NFDuration& rhs) const
{
    return ns_ >= rhs.ns_;
}

inline bool NFDuration::operator==(const NFDuration& rhs) const
{
    return ns_ == rhs.ns_;
}

inline NFDuration NFDuration::operator+=(const NFDuration& rhs)
{
    ns_ += rhs.ns_;
    return *this;
}

inline NFDuration NFDuration::operator-=(const NFDuration& rhs)
{
    ns_ -= rhs.ns_;
    return *this;
}

inline NFDuration NFDuration::operator*=(int n)
{
    ns_ *= n;
    return *this;
}

inline NFDuration NFDuration::operator/=(int n)
{
    ns_ /= n;
    return *this;
}

 

在NFDuration.cpp里是這樣初始化的:

#include "NFDuration.h"

const int64_t NFDuration::kNanosecond = 1LL;
const int64_t NFDuration::kMicrosecond = 1000 * kNanosecond;
const int64_t NFDuration::kMillisecond = 1000 * kMicrosecond;
const int64_t NFDuration::kSecond = 1000 * kMillisecond;
const int64_t NFDuration::kMinute = 60 * kSecond;
const int64_t NFDuration::kHour = 60 * kMinute;

 3個文件這樣寫,在windows,linux系統上使用后,編譯都沒有問題,但是我覺得NFDuration.in.h這個文件麻煩,就把NFDuration.in.h里的東西移到了NFDuration.h里

class NFDuration
{
public:
    static const int64_t kNanosecond; // = 1LL
    static const int64_t kMicrosecond;// = 1000
    static const int64_t kMillisecond;// = 1000 * kMicrosecond
    static const int64_t kSecond; // = 1000 * kMillisecond
    static const int64_t kMinute; // = 60 * kSecond
    static const int64_t kHour; // = 60 * kMinute
public:
    NFDuration();
    explicit NFDuration(const struct timeval& t);
    explicit NFDuration(int64_t nanoseconds);
    explicit NFDuration(int nanoseconds);
    explicit NFDuration(double seconds);

    // Nanoseconds returns the duration as an integer nanosecond count.
    int64_t Nanoseconds() const;

    // These methods return double because the dominant
    // use case is for printing a floating point number like 1.5s, and
    // a truncation to integer would make them not useful in those cases.

    // Seconds returns the duration as a floating point number of seconds.
    double Seconds() const;

    double Milliseconds() const;
    double Microseconds() const;
    double Minutes() const;
    double Hours() const;

    struct timeval TimeVal() const;
    void To(struct timeval* t) const;

    bool IsZero() const;
    bool operator<(const NFDuration& rhs) const;
    bool operator<=(const NFDuration& rhs) const;
    bool operator>(const NFDuration& rhs) const;
    bool operator>=(const NFDuration& rhs) const;
    bool operator==(const NFDuration& rhs) const;

    NFDuration operator+=(const NFDuration& rhs);
    NFDuration operator-=(const NFDuration& rhs);
    NFDuration operator*=(int ns);
    NFDuration operator/=(int ns);

private:
    int64_t ns_; // nanoseconds
};

inline NFDuration::NFDuration()
    : ns_(0)
{
}

inline NFDuration::NFDuration(const struct timeval& t)
    : ns_(t.tv_sec * kSecond + t.tv_usec * kMicrosecond)
{
}

inline NFDuration::NFDuration(int64_t nanoseconds)
    : ns_(nanoseconds)
{
}

inline NFDuration::NFDuration(int nanoseconds)
    : ns_(nanoseconds)
{
}

inline NFDuration::NFDuration(double seconds)
    : ns_((int64_t)(seconds * kSecond))
{
}

inline int64_t NFDuration::Nanoseconds() const
{
    return ns_;
}

inline double NFDuration::Seconds() const
{
    return double(ns_) / kSecond;
}

inline double NFDuration::Milliseconds() const
{
    return double(ns_) / kMillisecond;
}

inline double NFDuration::Microseconds() const
{
    return double(ns_) / kMicrosecond;
}

inline double NFDuration::Minutes() const
{
    return double(ns_) / kMinute;
}

inline double NFDuration::Hours() const
{
    return double(ns_) / kHour;
}

inline bool NFDuration::IsZero() const
{
    return ns_ == 0;
}

inline struct timeval NFDuration::TimeVal() const
{
    struct timeval t;
    To(&t);
    return t;
}

inline void NFDuration::To(struct timeval* t) const
{
    t->tv_sec = (long)(ns_ / kSecond);
    t->tv_usec = (long)(ns_ % kSecond) / (long)kMicrosecond;
}

inline bool NFDuration::operator<(const NFDuration& rhs) const
{
    return ns_ < rhs.ns_;
}

inline bool NFDuration::operator<=(const NFDuration& rhs) const
{
    return ns_ <= rhs.ns_;
}

inline bool NFDuration::operator>(const NFDuration& rhs) const
{
    return ns_ > rhs.ns_;
}

inline bool NFDuration::operator>=(const NFDuration& rhs) const
{
    return ns_ >= rhs.ns_;
}

inline bool NFDuration::operator==(const NFDuration& rhs) const
{
    return ns_ == rhs.ns_;
}

inline NFDuration NFDuration::operator+=(const NFDuration& rhs)
{
    ns_ += rhs.ns_;
    return *this;
}

inline NFDuration NFDuration::operator-=(const NFDuration& rhs)
{
    ns_ -= rhs.ns_;
    return *this;
}

inline NFDuration NFDuration::operator*=(int n)
{
    ns_ *= n;
    return *this;
}

inline NFDuration NFDuration::operator/=(int n)
{
    ns_ /= n;
    return *this;
}

這個時候在wondows上使用后編譯時沒有問題的, 但是在Linux上老是報static const成員沒有定義的錯誤,  於是我把初始化寫的類里面, 把NFDuration.cpp里的東西刪掉, NFDuration.h變成了這樣

 

class NFDuration
{
public:
    static const int64_t kNanosecond = 1LL;
    static const int64_t kMicrosecond = 1000;
    static const int64_t kMillisecond = 1000 * kMicrosecond;
    static const int64_t kSecond = 1000 * kMillisecond;
    static const int64_t kMinute = 60 * kSecond;
    static const int64_t kHour = 60 * kMinute;
.........................
其余與上面一樣

然后就發現,在Linux上是沒有問題了,但是在windows上又報static const成員沒有定義, 這是咋回事啊,網上搜索也沒有找到答案,最后只好又恢復成文字剛開始3個文件的樣子, 貌似只有這樣才沒有問題,兩個系統都能編譯,只是原因想不通

找了很久終於找到原因了,娘的啊。。。。。。。。。。。。。。。。。。。。。。。。

終於找到原因了,所有的問題都找錯了,不管怎么樣寫其實都沒有問題, 真正的問題是timeval這個數據結構的,沒法支持跨平台,而linux系統的編譯器老是誤報, 沒有吧問題真正的原因暴露出來,timeval我也不知道怎么做到快平台,最后只好加上libevent的頭文件,

解決了這個問題。 本來想刪掉這文章的,想想留住紀念吧!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM