2017-10-12 108 views

回答

3

它們是空操作,只是它們可能會產生編譯時錯誤。因此,它們可以在宏觀中用作斷言。 *&l確保l是一個左值,並且&*p確保p是(隱式轉換爲)指針。

#define ASSERT_LVALUE(l) (void)(*&(l)) 
#define ASSERT_POINTER(p) (void)(&*(p)) 

int main(void) { 
    int* p; 
    int i; 

    ASSERT_LVALUE(i); 
    ASSERT_LVALUE(3); /* error: lvalue required as unary ‘&’ operand */ 

    ASSERT_POINTER(p); 
    ASSERT_POINTER(i); /* error: invalid type argument of unary ‘*’ (have ‘int’) */ 
    ASSERT_POINTER(3); /* error: invalid type argument of unary ‘*’ (have ‘int’) */ 

    return 0; 
} 
+1

'&* p'適用於陣列。所以它實際上測試'p'是否可以隱式轉換爲指針 –

相關問題