struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;
typedef void (*abc) (obj)
我ä¸ç¡®å®štypedef void (*abc) (obj)
è¯å¥å«ä¹‰æ˜¯ä»€ä¹ˆã€‚请考虑我是新手。
ç”案 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
的类型,在您未æ供的代ç ä¸ã€‚