2014-03-26 28 views
3

'變量簡單的詢問我一直以爲我知道Ç不夠好,但我一直不能確定這兩個是否通過標準相當於:關於用C

/* ========= */ 

const int i; 
const int j; 

/* as opposed to */ 

const int i, j; 

/* ========= */ 

每當我只需要修改一些變量,我只是使用第一個符號。我知道這些作品對GCC和MSVC都有效,但是沒有閱讀過古老的「K & R」,我不知道這是否符合標準。

+4

這完全是一回事。 –

+1

難道不是關於編碼風格比標準更多嗎? – Mauren

+1

在這裏詢問可能會更快,但它教你比自己找出答案要少得多。你不需要獲得K&R的副本來做這件事(雖然它可能是可搜索的),只需編譯兩個簡單的源程序集並查看編譯器的變化(這很簡單,因爲沒有任何實質內容會有所不同)。 – mah

回答

4

是以下內容:

const int i; 
const int j; 

相當於

const int i, j; 

,如果這些的意思是指向int的指針,然後

const int* i, j; 

ISN」 t相同:

const int* i; 
const int* j; 

但後者兩個聲明等效於:

const int *i, *j; 
+3

也許這意味着將'\ *'附加到變量名稱而不是其類型(例如, int *我而不是int \ * i。使上述問題稍微直觀一些,以便閱讀和理解? – bph

+0

@Hiett是的,或者可能創建typedefs。 – devnull

+0

,說我注意到K&R使用int \ * i而不是int \ * i,所以我是誰來爭論;-) – bph

-1

人們可以查明這些表述是通過編譯一個簡單的測試,並在看組件輸出等效。

main() 
{ 
    const int i=1; 
    const int j=2; 
} 

GCC test.c的-S -o output.s -O0

main() 
{ 
    const int i=1, j=2; 
} 

兩個輸出是相同的,一些看起來是這樣的。 (我加了評論)。

main: 
    #Set up the stack frame 
    pushl %ebp 
    movl %esp, %ebp 

    #Make room on the stack for 2 local variables 
    subl $16, %esp 

    #Assign the literal value of 1 to the first local variable 
    movl $1, -4(%ebp) 

    #Assign the literal value of 2 to the second local variable 
    movl $2, -8(%ebp) 

    leave 

如果你想知道沒有提及到「常量」,這是因爲const的僅僅是在C的langauge更高級別的結構。

+1

但是如果你有'int * i; int * j;'和'int * i,j;',如果指針和整數具有相同的大小,反彙編不一定會顯示任何差異。 – Lundin

+0

這只是一個語法錯誤。我認爲這個問題的重點是關於'int i; int j;'和'int i,j;'或'int * i; int * j;'和'int * i,* j;'這是我的回答地址。 – user2675345

+0

我只是寫了幾個宏,聲明通過variadics傳遞給它的任何數量的變量。我提供了一個「修飾符」的參數,然後我開始想知道對於作爲可變參數傳遞的所有其他變量名會有什麼影響。 – Dehbop