Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >避免与C (C99)中的枚举名称冲突

避免与C (C99)中的枚举名称冲突
EN

Stack Overflow用户
提问于 2016-02-13 05:08:39
回答 1查看 16.7K关注 0票数 9

enum元素的名称容易与其他枚举元素名称、变量名称等发生重叠/碰撞。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enum Fruit
{
    apple,
    orange
};
typedef enum Fruit Fruit;


enum Color
{
    red,
    orange // <-- ERROR
};
typedef enum Color Color;


char apple='a'; // <-- ERROR

是否有符合C99的解决方案来避免冲突,而不是为每个枚举元素名称加上前缀?

边注:这个问题已经有了C++的答案

How to avoid name conflicts for two enum values with the same name in C++?

我在找一个C99解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-13 06:20:20

在C中,除了为枚举值的名称加上前缀之外,没有其他解决方案。

正如OP中所指出的那样,C++有许多机制,其中enum class可能是现代代码中指定的。但是,在实践中,结果是相同的:您将枚举元素的名称以枚举的名称作为前缀。可以说,Fruit::orangeFruitOrange更整洁,但它对我的眼睛没有多大影响。

在一些平行的宇宙中,有一种你可以用之写作的语言是很好的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Fruit selected = orange;

并让编译器在右边推导常量的命名空间.但我看不出这种语言是什么意思。C语言在这个意义上没有名称空间,即使有名称空间,类型系统也只允许转换;您不能基于LHS对操作符的RHS语法进行修改(我是故意使用单词语法的,因为名称查找是C中的一个语法属性)。

即使您确实有一些语言黑客,有时还隐含地插入了enum命名空间,但是您仍然需要在任何比较中使用显式前缀,因为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (apple > orange)

即使C中的枚举值都是int类型,也没有可以进行演绎的上下文,这使得FruitAppleFruitOrange具有可比性。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35380279

复制
相关文章
C语言定义数组时使用枚举作为数组的下标 ——c99功能
部分参考了https://blog.csdn.net/wq3028/article/details/76204690
用户4645519
2020/09/07
1.2K0
C语言C99标准中的变长数组(VLA)
该文介绍了在C语言C99标准中的变长数组(VLA)的相关知识,以及其在编译器中的实现和用法。具体包括变长数组在C语言中的定义和声明方式,以及其在编译器中的实现和用法。同时,还介绍了在GNU C下变长数组的使用和注意事项。
雷大亨
2018/01/01
3.8K0
C语言C99标准中的变长数组(VLA)
c99的新功能
在ANSI的标准确立后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化创建过程中继续发展壮大。《标准修正案一》在1994年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。C99被ANSI于2000年3月采用。
用户4645519
2020/09/08
4210
c++枚举类型enum输出_python中的枚举
Enum枚举:枚举是一组命名整型常量,枚举类型是使用 enum 关键字声明的。枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储,其包含自己的值,且不能被继承或者传递继承,枚举中每个元素的基础类型是 int。可以使用冒号指定另一种整数值类型。
全栈程序员站长
2022/10/01
1.5K0
c++枚举类型enum输出_python中的枚举
(C99)复合字面量
#include <stdio.h> struct argvs { char a[64]; int b; }; int pfunc(struct argvs *a) { printf("argvs.a=%s argvs.b=%d\n", a->a, a->b); } int func(struct argvs a) { printf("argvs.a=%s argvs.b=%d\n", a.a, a.b); } int main(int argc, char *arg
用户4645519
2020/09/08
5500
(C99)复合字面量
C#中的枚举器(译)
翻译文章,原文链接(已失效):http://www.ondotnet.com/pub/a/dotnet/2004/06/07/liberty.html
张子阳
2018/09/27
1.9K0
C# 中的“智能枚举”:如何在枚举中增加行为
在这个示例中,我们定义了一个名为 Weekday 的枚举,其中包括每个星期的日子。然后在 Main 方法中,我们将 today 变量设置为 Tuesday,并使用 ToString() 方法将其转换为字符串。
郑子铭
2023/08/30
3240
C# 中的“智能枚举”:如何在枚举中增加行为
C11与C99的变化对比
C11标准是C语言标准的第三个版本,前一个标准版本是C99标准。2011年12月8日,国际标准化组织(ISO)和国际电工委员会
用户7886150
2021/02/17
2.2K0
C#的“智能枚举”:在枚举中增加行为?
在这个示例中,我们定义了一个名为 Weekday 的枚举,其中包括每个星期的日子。然后在 Main 方法中,我们将 today 变量设置为 Tuesday,并使用 ToString() 方法将其转换为字符串。
郑子铭
2023/08/30
4060
C#的“智能枚举”:在枚举中增加行为?
c99 增加的restrict关键字
c99中新增加了一个类型定义,就是restrict。 restrict的定义是It can be applied only to pointers, and it indicates that a pointer is the sole initial means of accessing a data object. 我不知道确切应该怎么翻译,大意是restrict只对指针有用,它声明一个指针是唯一初始化访问一个数据对象。 比如,按照书上的例子,
一见
2018/08/07
6260
PHPShell - 流行的 C99 变体的安全构建
web shell 的一个很好的例子是 c99 变体,它是一个 PHP shell(大多数人称之为恶意软件),经常上传到易受攻击的 web 应用程序,为黑客提供接口。c99 shell 允许攻击者控制 Internet 服务器的进程,允许他或她作为威胁正在运行的帐户在服务器上发出命令。它允许黑客上传、浏览文件系统、编辑和查看文件,此外还可以删除、移动文件和更改权限。查找 c99 shell 是识别系统妥协的极好方法。如果打包,c99 shell 大约有 1500 行,如果正确显示则有 4900 多行,它的一些特性包括显示 Web 服务器可能使用的安全措施,一个有权限的文件查看器,它有许多可用于编写保护对策的签名。
Khan安全团队
2023/02/23
5600
PHPShell - 流行的 C99 变体的安全构建
【swagger】C# 中 swagger 的使用及避坑
开发 web api 的时候,写文档是个痛苦的事情,而没有文档别人就不知道怎么调用,所以又不得不写。
丹枫无迹
2020/04/08
7.3K0
【swagger】C# 中 swagger 的使用及避坑
C99显示函数名的宏__func__
在调试代码或者写一些通用的测试函数的时候,有时候想如果能够用字符串的方式显示出正在调用的函数名该有多好。其实在C99标准中就已经有了这样的宏__func__,只是平常不怎么被提起。那么这个宏怎么用呢?
mythsman
2022/11/14
3650
C# 枚举在属性中运用
//默认ZFLText属性值为"Label"  [DefaultValue(typeof(DisplayMode), "Label")]  public DisplayMode ZFLText   {       get;       set;   } [Serializable]     public enum DisplayMode     {         /// <summary>         /// 显示文本         /// </summary>         Label,   
跟着阿笨一起玩NET
2018/09/18
2.3K0
C# 枚举在属性中运用
使用Elastic Job的namespace配置,防止任务名称的冲突
昨天,有群友反应根据之前这篇《使用Elastic Job实现定时任务》(https://blog.didispace.com/spring-boot-learning-2-7-2/)文章编写测试定时任务的时候,报了类似下面的这个错误: Caused by: org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException: Job conflict with register center. The job 'my-
程序猿DD
2023/04/04
6260
使用Elastic Job的namespace配置,防止任务名称的冲突
C99标准里的inttypes.h头文件
其中的PRIu32是什么意思?上网搜了一下才知道是C99标准里新引入的宏定义,如下:
用户7886150
2021/02/20
1.5K0
C++避坑指南
导语:如果,将编程语言比作武功秘籍,C++无异于《九阴真经》。《九阴真经》威力强大、博大精深,经中所载内功、轻功、拳、掌、腿、刀法、剑法、杖法、鞭法、指爪、点穴密技、疗伤法门、闭气神功、移魂大法等等,无所不包,C++亦如是。 C++跟《九阴真经》一样,如果使用不当,很容易落得跟周芷若、欧阳锋、梅超风等一样走火入魔。这篇文章总结了在学习C++过程中容易走火入魔的一些知识点。为了避免篇幅浪费,太常见的误区(如指针和数组、重载、覆盖、隐藏等)在本文没有列出,文中的知识点也没有前后依赖关系,各个知识点基本是互
腾讯技术工程官方号
2019/06/12
1.6K0
C++避坑指南
C++与MySQL的冲突
当在C++代码中,直接引用MySQL头文件时,可能会遇到如下错误: In file included from /usr/include/c++/4.1.0/bits/char_traits.h:46,                  from /usr/include/c++/4.1.0/string:46, /usr/include/c++/4.1.0/bits/stl_algobase.h:92:28: error: macro "swap" requires 3 arguments, but only 2 given /usr/include/c++/4.1.0/bits/stl_algobase.h:127:26: error: macro "swap" requires 3 arguments, but only 2 given /usr/include/c++/4.1.0/bits/vector.tcc:176:20: error: macro "swap" requires 3 arguments, but only 1 given /usr/include/c++/4.1.0/cctype:70: error: '::isalnum' has not been declared /usr/include/c++/4.1.0/cctype:71: error: '::isalpha' has not been declared /usr/include/c++/4.1.0/cctype:72: error: '::iscntrl' has not been declared /usr/include/c++/4.1.0/cctype:73: error: '::isdigit' has not been declared /usr/include/c++/4.1.0/cctype:74: error: '::isgraph' has not been declared /usr/include/c++/4.1.0/cctype:75: error: '::islower' has not been declared /usr/include/c++/4.1.0/cctype:76: error: '::isprint' has not been declared /usr/include/c++/4.1.0/cctype:77: error: '::ispunct' has not been declared /usr/include/c++/4.1.0/cctype:78: error: '::isspace' has not been declared /usr/include/c++/4.1.0/cctype:79: error: '::isupper' has not been declared /usr/include/c++/4.1.0/cctype:80: error: '::isxdigit' has not been declared /usr/include/c++/4.1.0/cctype:81: error: '::tolower' has not been declared /usr/include/c++/4.1.0/cctype:82: error: '::toupper' has not been declared 解决办法: 尽量对MySQL进行二次包装,让调用者看不到MySQL头文件,如在CPP中包含: #include #include #include 在头文件中只进行引用声明: struct st_mysql; struct st_mysql_res; typedef long num_t; typedef char ** MYSQL_ROW;  /** return data as array of strings */ 不要在头文件直接include到MySQL的头文件,而且保证只在一个CPP文件中有对MySQL文件的include,否则你可能遇到很多莫名其妙的编译错误,如果不想到这一点,即使花一天时间也未必能找到错误原因。
一见
2018/08/07
1K0
MATLABfill函数_matlab中C的模块名称是什么
matlab移植C/C++代码时,发现不管是opencv还是IPP库都没有填充联通区域函数imfill(),于是只能自己动手了。
全栈程序员站长
2022/10/02
8100
MATLABfill函数_matlab中C的模块名称是什么
CA1714:Flags 枚举应采用复数形式的名称
枚举具有 System.FlagsAttribute,并且其名称不是以“s”结尾。
呆呆
2022/02/18
4300

相似问题

枚举值与枚举名称冲突

20

C/ C99 /C++/C++x/GNU C/GNU C99中枚举的签名

21

如何避免与Windows头文件中定义的宏的名称冲突?

82

反语-声明/语句冲突中的C99语法

14

C#枚举与可为空的属性名称冲突

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文