在C中用enum命名一个与用户定义数据类型相同的函数是否合法? 例如:
enum sentence_id sentence_id(const char *sentence, bool strict);
和enum sentence_id定义如下:
enum sentence_id {
MINMEA_INVALID = -1,
MINMEA_UNKNOWN = 0,
MINMEA_SENTENCE_RMC,
MINMEA_SENTENCE_GGA,
MINMEA_SENTENCE_GSA,
};
是否适用于其他用户定义的数据类型(作为结构)?
答案 0 :(得分:2)
这看起来很奇怪,因为枚举和函数的标识符是相同的,这是可能的,因为枚举标识符始终必须遵循enum
关键字,enum
始终跟随标识符。
所以让我们给他们不同的名字:
enum minmea_sentence_id_e
{
…
};
这定义了一个名为minmea_sentence_id_e
的枚举。
该函数也会获得另一个标识符:
enum minmea_sentence_id_e minmea_sentence_id_f(const char *sentence, bool strict);
现在应该很清楚,有一个名为minmea_sentence_id_f
的函数返回一个名为minmea_sentence_id_e
的枚举值。
答案 1 :(得分:0)
我不明白这句话的含义
所以我认为这不是你的代码。让我们看看对方写的是什么:
enum minmea_sentence_id { ... };
在(Objective-)C中,这声明了一个枚举类型minmea_sentence_id
,它通过在名称前添加enum
来使用。例如:
enum minmea_sentence_id mySentenceID;
声明一个名为enum minmea_sentence_id
的{{1}}类型的变量。
请注意,如果不是上述内容,他们写了:
mySentenceID
然后typedef enum { ... } minmea_sentence_id;
本身就是一个类型名称,上面的示例声明就是:
minmea_sentence_id
但是他们没有这样做,因此在使用类型时需要minmea_sentence_id mySentenceID;
。
为什么重复两次?
他们写了函数声明:
enum minmea_sentence_id minmea_sentence_id(const char * sentence,bool strict);
函数声明中的第一项是返回类型,从上面我们知道这是前两个标记enum
。
接下来是声明的函数的名称enum minmea_sentence_id
,看起来很奇怪 - 命名一个函数与一个类型相同 - 但根本不是非法的,但通常强烈建议不要因为它使代码更难读!
这就是为什么它会重复两次,但为什么他们会这样做呢?
我们只能猜测,但是(Objective-)C ++支持函数式转换,例如:
minmea_sentence_id
现在考虑调用int x = (int)expo; // valid in (Objective-)C(++)
int y = int(expr); // valid in (Objective-)C++ and NOT in (Objective-)C
函数的内容:
minmea_sentence_id
有点像功能风格的演员表。也许这就是他们的想法,但这只是猜测!
HTH