2016-01-19 77 views
-3

這裏是我的代碼在gcc c99,其中有我的代碼中的「空值」?「無效值不被忽略,因爲它應該是」當使用gcc

int main(int argc, char **argv) { 
    char *s = "smth"; 
    int r2 = ({ if (__builtin_types_compatible_p(__typeof__(s), char*)) { true; } else { false; }}); 
    return (0); 
}; 

更新

更糟的是,下面的代碼有相同的錯誤

int main(int argc, char **argv) { 
    char *s = "smth"; 
    int r2 = ({if (1) {1;} else {0;}}); 
    return (0); 
}; 
+2

1)這是多麼糟糕的原因。 2)你認爲選擇聲明應該返回什麼? - 無論如何,這不符合標準3)爲什麼不堅持標準並使用條件表達式 - 或者4)您根本不需要條件構造。 – Olaf

回答

2

你試圖給if聲明分配給int。該聲明沒有類型,因此您會看到錯誤。

你想,而不是什麼ternary operator

condition ? true_value : false_valse 

如果condition計算結果爲真,則表達式的true_value的值,否則它的false_value值。

所以,你要的是這樣的:

int r2 = (__builtin_types_compatible_p(__typeof__(s), char*)) ? true : false; 

或者,由於這兩個值只是truefalse

int r2 = __builtin_types_compatible_p(__typeof__(s), char*); 
1

聲明

if (condition) {statement} 

將返回void和你不能用來初始化/分配一個變量。最好使用三元操作?:

int r2 = __builtin_types_compatible_p(__typeof__(s), char*) ? true : false 

或更好

bool r2 = __builtin_types_compatible_p(__typeof__(s), char*) // Use stdbool.h 

因爲__builtin_types_compatible_p返回1如果給定類型相同,否則返回0

+2

1)當用布爾常量初始化時,爲什麼不使用'bool'? 2)爲什麼有條件的東西?只要'bool r2 = __builtin_types_compatible_p(__ typeof __(s),char *)'就足夠清楚了(它應該有一個不言自明的名字)。 – Olaf

+0

@Olaf;實際上你是對的。我補充說。 – haccks

相關問題