#include <iostream>
using namespace std;
typedef int num;
int main() {
num a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
這樣,如果我必須通過更改一行代碼將其更改爲浮點數或複數。是typedef是否有助於提高可擴展性
這是一個很好的做法嗎?
#include <iostream>
using namespace std;
typedef int num;
int main() {
num a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
這樣,如果我必須通過更改一行代碼將其更改爲浮點數或複數。是typedef是否有助於提高可擴展性
這是一個很好的做法嗎?
我不會說
typedef int num;
因爲num
並不真正意味着更多,而不是傳授更多信息,這種風格是非常有用的。但是,你做什麼,看到的是分離的類型,例如像
typedef long time_t
在這種情況下,在標準庫,而不是使用長代表秒數,您可以使用time_t
。該標準允許實現者在參數(包括浮點)內爲其選擇不同的類型。
所以,我會在減少或指定類型的含義時使用typedef,並且有幾個選擇可以滿足該定義,並且您不希望任何人依賴選擇,而僅僅是規範。
更有趣的問題是:爲什麼你想改變變量的類型?
因爲你必須記住,甚至像int和float這樣的數值變量在某些情況下也會有不同的表現,並且無論什麼時候將它用作這種「通用」變量,都需要考慮這些情況。因此,我傾向於這樣說:不,它不是,作爲副作用(特別是一旦項目變得比僅僅是一個hello世界更大一點;))發揮太大的作用,你可以改變類型
理論上,從學術的角度來看,答案可能是「是」。但在現實世界中,我發現答案几乎總是「不」,這就是爲什麼。
你說你的理想將能夠做一個1行代碼更改從int
s切換到float
s例如,並完成。這很好,但由於某種原因,這幾乎從來沒有可能實現。
考慮一下你的實際例子。如果你有這樣的代碼:
typedef int num;
...
num = 42;
...
if(42 == num)
// MAGIC HAPPENS
...然後將其更改爲:
typedef float num;
...代碼很可能會編譯,但它無法正常工作。那是因爲你不能將浮點數與一個常量變量相比較。花車是不精確的,42f
的實際表示可能類似41.99999999999999
,然後if(42f == num)
將返回false。
其他例子無處不在。例如,在STL集合類中使用typedef
是最好的例子。如果你有這樣的:
typedef vector<string> strings;
strings my_strings;
...
my_strings.find("hello");
...你不能只是改變的typedef是list<string>
因爲list
沒有一個find
成員函數。
根據我的經驗,typedef
對保存輸入非常有用,從而節省了潛在的錯誤,並且使代碼更具可讀性。例如:
for(strings::iterator it = my_strings.begin(); it != my_strings.end(); ++it)
...可以說是比更易讀:
for(vector<string>::iterator it = my_strings.begin(); it != my_strings.end(); ++it)
...特別是當容器的類型變得越來越複雜。
對於不斷變化的實現和寬鬆的規範,*總是* true。接口原則上遭受同樣的問題,但他們被稱爲主的新來臨。我*仍*本能地同意你的評估,但我認爲這不完全準確。 – 2011-03-31 17:58:39
在某些情況下,typedef
很重要。有一些技術,如Policy Clone。另外看看在GotW #46由Herb薩特給出的理由:
Typeability
短的名字
可讀性
typedef int (*Func)(int*);
Func t(int);
而不是
int (*t(int))(int*);
便攜
#if defined USING_COMPILER_A
typedef __int32 Int32;
typedef __int64 Int64;
#elif defined USING_COMPILER_B
typedef int Int32;
typedef long long Int64;
#endif
這似乎是一個很危險的事情。 – asawyer 2011-03-31 15:30:39
如果你的論點是你可以改變類型爲'unsigned'或'long'或另一種整數類型,那麼你可能會更安全。從整數變爲浮點是一個更大的變化,相應地不太安全。 – 2011-03-31 15:37:08