2015-09-18 60 views
2

我通常不需要幫助來理解錯誤信息,但是這個看起來好像是必須的錯誤。我已經梳理了「可能已經有答案的問題」,但似乎沒有一個使用C11最近添加的功能_Generic,所以我認爲這可能是一個獨特的問題。這裏是我的測試用例:解釋`_Generic`錯誤信息:error:一元'`*`'(有'int`')的無效類型參數

#include <stdio.h> 
#define foo(bar) _Generic((bar), int: sizeof (bar) \ 
           , int *: sizeof *(bar)) 

int main(void) { 
    printf("%d\n", foo(42)); 
} 

我看到了GCC 5.2,錯誤消息如下:

鐺發出類似含義的消息:

fatal error: indirection requires pointer operand (' int ' invalid)

note: expanded from macro ' foo '

這些消息似乎暗示以下之一:

  • The co mpiler選擇int *通用關聯中的表達式。
  • 來自通用關聯的表達式都進行了評估。

C11§6.5.1.1p3似乎明確禁止這兩種解釋:

The controlling expression of a generic selection is not evaluated. If a generic selection has a generic association with a type name that is compatible with the type of the controlling expression, then the result expression of the generic selection is the expression in that generic association. Otherwise, the result expression of the generic selection is the expression in the default generic association. None of the expressions from any other generic association of the generic selection is evaluated.

任何人能提供一些線索在此錯誤信息給我嗎?

+3

我認爲你誤解了「評估」一詞。僅僅因爲某些東西沒有被評估,並不意味着它可能是無效的C代碼('sizeof *(42)')。 – cremno

+0

@cremno:'sizeof *(42)'是完全有效的...... – 3442

+0

@BLUEPIXY謝謝。我錯過了重新格式化代碼時('_Generic'以前全是一行)。我已經修復了問題中的代碼,但錯誤仍然存​​在。 – Sebivor

回答

2

編譯器是正確的:sizeof *(42)是違反約束的,因爲它將*應用於整型表達式。現在有一件事對於_Generic知道很重要,這不是處理預處理時間,而是作爲C語言意義上的適當表達(具有最高優先級)。這_Generic表達的其實一樣做這樣的事情

(1 ? sizeof (42) : sizeof *(42)) 

的影響在這裏,你知道,第二支是永遠不會計算,仍然沒有人認爲編譯。

相關問題