2012-11-06 67 views
0

在代碼中,我發現了一些其他的代碼* 這是什麼?什麼是*(取消引用操作符)在枚舉聲明中做什麼?

這裏是那個代碼的原型,它沒有給出任何錯誤。 只有警告來自gcc 4.5.2但是在窗口中它沒有給出警告並且編譯正確。由於公司的IP,我無法提供實際的代碼,但我想知道這是如何以及爲什麼這是正確的?

#include<stdio.h> 

typedef enum e 
{ 
     a, 
     b, 
     c 
}x,*y; 

int main() 
{ 
     x t=4; 
     printf("x : %d\n",t); 
     y m=5; 
     printf("*y : %d\n",m); 
     return 0; 
} 
+0

行'y m = 5;'是從整數到指針的轉換,沒有強制轉換。當你受到警告時,這很值得關注。 –

回答

6

它等效於:

typedef enum e *y; 

所以yenum e *一個別名,即y m聲明m爲指針enum e。下面的代碼工作果然:

#include <stdio.h> 

x t = 4; 
printf("x : %d\n", t); 
y m = &t; 
printf("*y : %d\n", *m); 
5

這是一般模式typedef TYPE * NAME,這僅僅意味着「從這個角度,NAME是該類型的別名‘指針TYPE的只是一個特例’在這裏。 ,TYPE可以是任何有效的類型聲明

一般來說,我反對typedef:因爲它使得使用該類型的代碼非常混亂,C中的指針非常重要,它是通常很高興知道你是否有價值或只是指向價值的指針,並且這種做法使得這個事實隱藏起來。

+0

+1不用於鍵入星號,這在閱讀代碼時非常糟糕。 – Eregrith

+0

除非它是一個指向不完整類型的指針,在這種情況下,就用戶而言,它是一個句柄,可能他們沒有關心句柄是作爲指針還是整數實現的。但這個例子不是那樣的。 –

2

它不是一個尊敬的操作符(在這個用法中),它是一個指向enum e的指針。

你得到一個警告的原因可能是這一行:

y m=5; 

你分配給一個指針的整數。你需要爲它分配一個地址:

y m=&t;