回答
double可能是一個壞主意,除非你打算使用Knuth風格的版本收斂在一個不合理的數字上。 int數組或字符串有什麼問題?
A double
將是一個可怕的候選人,因爲浮點數不夠精確。
我會建議一個類與幾個int
成員。只是超載一些操作員。
使用兩個整數 - 一個用於主要版本號,另一個用於次要版本號。或者,使用一個字符串:)雙重聽起來不像一個好的候選人,因爲很多數字不能完全由雙打來表示。
我想我會使用array<unsigned char, 4>
左右。這允許諸如11.2.1.3
之類的東西,如果你最終需要它,並且仍然使用比雙倍更少的空間。
我還沒有看到版本號超過255的單個組件,所以
版本號超過255的單個組件是非常罕見的,我懷疑爲每個組件使用char是否真的是一個限制。如果您決定將每日版本號嵌入到版本號中,則會有明顯的例外。
如果你真的想要的多功能性,你可以這樣做:
typedef unsigned char component_t;
array<component_t, 4> version;
只是有一個陷阱與此:讀它,你需要知道component_t
是什麼。處理這個問題的明顯方法是使用一個單字節的版本號來告訴您使用的版本號是什麼版本,所以無論何時您更改component_t(或允許的組件數),您都可以增加它! :-)
@ildjarn:好的,我已經稍微改寫了一下。 –
使用int並讓1000對應版本1.0,很簡單。
一些圖書館使用像招數:
#define PKG_MAJOR (3) // example values...
#define PKG_MINOR (7)
#define PKG_MICRO (11)
const unsigned long pkg_version = (PKG_MAJOR * 1000 + PKG_MINOR) * 1000 + PKG_MICRO;
即pkg_version是3007011.
有關使用unsigned int
還是這樣嗎?我剛纔看到這個在linux kernel Makefile
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
你有一個內核版本a
,主要版本b
和次要版本c
。您可以輕鬆比較兩個版本的順序。如果你想讓這個版本具有很好的可打印格式,你可以添加一個函數來創建一個版本字符串,例如"2.6.38"
。 (當然,您被限制爲最多256個子版本...使用unsigned long long
。?)
我用semantic versioning,因此我創建了以下用戶定義類型:
版本。HPP
#include <string>
#include <cstdlib>
#include <iostream>
class Version_Number{
public:
//constructors
Version_Number(); //<- constructs to 0.0.0
Version_Number(std::string const& version_number);
//transformers
void Major_Update();
void Minor_Update();
void Bug_Update();
//observers
std::string str();
friend std::ostream& operator<<(std::ostream& os, const Version_Number& r);
bool operator < (Version_Number const& other) const;
bool operator > (Version_Number const& other) const;
bool operator == (Version_Number const& other) const;
bool operator != (Version_Number const& other) const;
private:
unsigned int a,b,c;
};
version.cpp
#include <string>
#include <cstdlib>
#include <iostream>
#include "version_number.hpp"
Version_Number::Version_Number(): a(0),b(0),c(0){}
Version_Number::Version_Number(std::string const& folder_name){
std::string a_str,b_str,c_str;
auto it = folder_name.begin();
while (*it != '.'){
a_str+=*it;
++it;
}
++it;
while (*it != '.'){
b_str+=*it;
++it;
}
++it;
while (it != folder_name.end()){
c_str+=*it;
++it;
}
a = std::atoi(a_str.c_str());
b = std::atoi(b_str.c_str());
c = std::atoi(c_str.c_str());
}
void Version_Number::Major_Update(){
++a;
b = 0;
c = 0;
return;
}
void Version_Number::Minor_Update(){
++b;
c = 0;
return;
}
void Version_Number::Bug_Update(){
++c;
return;
}
std::string Version_Number::str(){
std::string str;
str+= std::to_string(a);
str+='.';
str+= std::to_string(b);
str+='.';
str+= std::to_string(c);
return str;
}
bool Version_Number::operator < (Version_Number const& other) const{
if (a > other.a){return false;}
if (a < other.a){return true;}
if (b > other.b){return false;}
if (b < other.b){return true;}
if (c > other.c){return false;}
if (c < other.c){return true;}
return false;
}
bool Version_Number::operator > (Version_Number const& other) const{
if (a < other.a){return false;}
if (a > other.a){return true;}
if (b < other.b){return false;}
if (b > other.b){return true;}
if (c < other.c){return false;}
if (c > other.c){return true;}
return false;
}
bool Version_Number::operator == (Version_Number const& other) const{
if (a == other.a){
if (b == other.b){
if (c == other.c){
return true;
}
}
}
return false;
}
bool Version_Number::operator != (Version_Number const& other) const{
if (a == other.a){
if (b == other.b){
if (c == other.c){
return false;
}
}
}
return true;
}
std::ostream& operator<<(std::ostream& os, const Version_Number& r){
os << r.a << '.' << r.b << '.' << r.c;
return os;
}
- 1. PostgreSQL中適用於JSON數據類型的正確用例是什麼?
- 2. 什麼是正確的數據類型用於一個號碼
- 3. 適用於數據密集型軟件的SharePoint(基礎版)
- 4. 什麼是適用於HIVE的nvarchar,MYSQL數據庫的適當數據類型?
- 5. 版本9.6中的to_regclass參數數據類型是什麼?
- 6. 適用於Kindle Fire的android minSdkVersion運行軟件版本6.3.2是什麼?
- 7. 適用於存儲ISOYearMonth的Oracle數據類型是什麼?
- 8. 什麼是firestore引用數據類型適用於?
- 9. 在Kubernetes中用於持久性數據的正確卷類型是什麼?
- 10. 什麼是可能的熊貓基本/標量數據類型?
- 11. 使用正確的數據類型的原因是什麼?
- 12. C#債券中可用的數據類型是什麼?
- 13. 什麼版本控制軟件最適合僅適用於HTML/CSS/JavaScript網站?
- 14. 什麼是PostgreSQL陣列數據類型的正確用例?
- 15. 什麼是postgresql DB中唯一鍵的正確數據類型?
- 16. 什麼是.NET版本控制軟件
- 17. 什麼是Swift - Obj-c使用Xcode的正確版本號?
- 18. WINOLEAPI的C#數據類型是什麼?
- 19. 零功能的正確參數類型是什麼?
- 20. 什麼是C#中的可空類型?
- 21. 什麼是C#中的可空類型?
- 22. 運算符[]的正確輸入數據類型是什麼?
- 23. 這是什麼類型的數據庫,可能是sql注入?
- 24. 什麼是vcalendar的正確MIME類型
- 25. @@ ROWCOUNT的正確類型是什麼?
- 26. boost :: mem_fn的正確類型是什麼?
- 27. JSON的正確MIME類型是什麼?
- 28. 對於不同版本的.NET,正確的版本控制策略是什麼
- 29. 用於軟件開發的最佳Linux發行版是什麼,主要是C?
- 30. 用PHP確定文件類型。什麼是Magic數據庫?
我想象四捨五入發生並獲得免費:) – AraK
下一個版本是這樣一個版本的營銷或工程版本?因爲一些營銷人員_will_想出了一個可愛的版本名稱而不是數字,因爲_math很難_ :( – MSalters