2010-09-17 133 views
2

我在我的代碼如下聲明:變量聲明的問題

u32 volatile __attribute__((nocast)) *A, *B; 

這是等同於:

u32 volatile __attribute__((nocast)) *A; 
u32 volatile __attribute__((nocast)) *B; 

或:

u32 volatile __attribute__((nocast)) *A; 
u32 volatile       *B; 

甚至:

u32 volatile __attribute__((nocast)) *A; 
u32         *B; 

這是一個小的更新。這是linux內核代碼,所以唯一可能的編譯器是gcc。我知道我可能最終會寫多行,但我很好奇。

例如,在以下linux kernel code中,它們的用法與我想要的類似。這是代碼錯誤嗎?


最後一個更新,如果我用下面的代碼:

int main() { 
    int __attribute__((weak)) a, b; 
} 

我得到下GCC以下警告:

foo.c: In function ‘main’: 
foo.c:5: error: weak declaration of ‘a’ must be public 
foo.c:5: error: weak declaration of ‘b’ must be public 

這是說,我認爲它試圖以應用屬性到兩個變量。我將運行它的想法,它不會改變屬性類型。

+1

我不知道那是否意味着其他讀代碼的人可能不會。爲什麼不只是長時間打字並擺脫歧義。 – 2010-09-17 17:15:39

+1

或使用typedef ... – 2010-09-17 17:18:30

+0

@Paul R - 你可以在'typedef'中使用'__attribute__'嗎? – detly 2010-09-17 17:26:09

回答

4

volatile限定符是整個聲明的通用部分。 *是個別聲明的一部分。所以

u32 volatile *A, *B; 

相當於

u32 volatile *A; 
u32 volatile *B; 

這是語言規範的話。

但是,__attribute__不是該語言的一部分,這意味着您必須查閱您的編譯器文檔以瞭解其行爲。

3

這取決於你使用的編譯器和__attribute__((nocast))對它的意義。這不是標準的C,介意你。

無論如何,謹慎的做法是通過簡單地爲每個變量分別寫入聲明來保護自己免於歧義。

+0

+1如果對如何解釋代碼存在任何疑問,只需以非歧義形式重新編寫代碼即可。 – bta 2010-09-17 17:32:09

1

〜您可以測試它並查看,但我不想編寫依賴於該代碼的代碼。其他讀者不清楚,你可能會忘記它是哪種方式,或者因爲它是一個擴展,它可能會改變,或者可能由不同的編譯器供應商以不同的方式完成,這些供應商試圖提供這種語法(intel的linux C/C++編譯器,llvm和其他一些編譯器使用這種源自GCC的語法{我相信})。

你可能應該使用typedef或不同的行來清楚並確定這一點。

如果您正在編寫另一個編譯器,並希望將語法與〜標準匹配,那麼您的最佳資源將要求gcc開發人員列表。

+0

我真的不知道如何測試它。我正在網上查看,看看我是否可以讓gcc打印出字符串的類型名稱,但我找不到任何東西。 – 2010-09-17 18:37:02