c中的这个陈述是什么æ„æ€ï¼Ÿ

时间:2013-04-25 17:07:53

标签: c pointers struct typedef

struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;

typedef void (*abc) (obj)

我ä¸ç¡®å®štypedef void (*abc) (obj)语å¥å«ä¹‰æ˜¯ä»€ä¹ˆã€‚请考虑我是新手。

3 个答案:

答案 0 :(得分:8)

å³ä½¿å¿½ç•¥ä¸¢å¤±çš„分å·ï¼Œä¹Ÿæ²¡æœ‰ä»»ä½•æ„义;这是一个错误。

如果obj是类型å称,它会将abc定义为类型void (*)(obj)的别å,å³ä½œä¸ºæŒ‡å‘类型为{{{{1}çš„å•ä¸ªå‚数的函数的指针。 1}}并返回obj。

但由于void是一个对象å,而ä¸æ˜¯ä¸€ä¸ªç±»åž‹å,实际上并ä¸æ˜¯å®ƒçš„å«ä¹‰ã€‚

当我用gcc编译它时,我收到一个警告:

obj

当我使用warning: parameter names (without types) in function declaration 进行编译时,警告将æˆä¸ºè‡´å‘½é”™è¯¯ã€‚

æ—§å¼ï¼ˆéžåŽŸåž‹ï¼‰å‡½æ•°å®šä¹‰å¯ä»¥åˆæ³•åœ°ä¸ºå‚数指定å称,而ä¸æ˜¯ç±»åž‹ï¼š

-pedantic-errors

但该表å•å¯¹å‡½æ•°å£°æ˜Žæ— æ•ˆã€‚在声明中,括å·ä¹‹é—´çš„å•ä¸ªæ ‡è¯†ç¬¦å¿…须是类型å称,而ä¸æ˜¯å‚æ•°çš„å称 - 这使得声明æˆä¸ºåŽŸåž‹ã€‚

gcc的错误消æ¯æš—示它正在å°è¯•å°†å…¶è§£é‡Šä¸ºå®ƒæ˜¯æ—§å¼å®šä¹‰çš„开头,然åŽåˆ¤æ–­å®ƒæ˜¯æ— æ•ˆçš„,因为它åªæ˜¯ä¸€ä¸ªå£°æ˜Žã€‚

最é‡è¦çš„是你应该密切关注编译器警告。

我们å¯ä»¥çŒœæµ‹çš„æ„图是什么。也许void old_style_func(obj) /* obj is implicitly of type int */ { } å¯èƒ½æ˜¯ä¸€ä¸ªç±»åž‹å称,而且:

obj

应该是:

struct def
{
    //some data memebers
}obj;

或者æ„外çœç•¥äº†ç±»åž‹å称,最åŽä¸€è¡Œåº”该是:

typedef struct def
{
    // some data members
} obj;

虽然在这ç§æƒ…况下,å称typedef void (*abc) (struct def obj); 被用于ä¸åŒç›®çš„两次(åˆæ³•ä½†ä»¤äººå›°æƒ‘)。但如果没有更多的背景,就ä¸å¯èƒ½ç¡®å®šå¦‚何“修å¤â€å®ƒã€‚

这段代ç æ¥è‡ªå“ªé‡Œï¼Ÿæ‚¨æ˜¯å¦ç¡®å®šæ‚¨å·²å‘我们展示了确切的代ç ï¼Ÿä½ è¯•å›¾ç¼–译它时å‘生了什么?

答案 1 :(得分:2)

它将类型abc定义为指å‘函数的指针,该函数接å—一个å为intçš„{​​{1}}类型的å‚数,并且ä¸è¿”回任何内容(obj)。

答案 2 :(得分:0)

它为指å‘函数的指针类型引入了一个新å称abc,该函数接å—obj并返回void。指å‘函数的指针的类型总是在声明中以这ç§è¿‚回方å¼æŒ‡å®šï¼š

  

return-type (* å称正在宣布 )( å‚数列表 )

顺便æ一下,声明中的*å¯èƒ½æ˜¯ä¸å¿…è¦çš„。当你需è¦å®ƒä»¬æ—¶ï¼Œå‡½æ•°ç±»åž‹æ€»æ˜¯ç¥žå¥‡åœ°å˜æˆæŒ‡å‘函数的类型(比如数组类型如何神奇地å˜æˆæŒ‡å‘元素的类型),你å¯ä»¥ç›´æŽ¥ä½¿ç”¨å‡½æ•°ç±»åž‹ï¼ˆè€Œä¸æ˜¯æŒ‡é’ˆæŒ‡å‘ - 函数类型)声明一个新函数。

正如其他人所指出的,您æ供的上下文没有å为obj的类型,åªæœ‰å为obj的对象。如果此代ç ç¼–译,则必须在其他地方定义å¦ä¸€ä¸ªå为obj的类型,在您未æ供的代ç ä¸­ã€‚