相关疑难解决方法(0)

我应该使用#define,enum还是const?

在我正在研究的C++项目中,我有一个标志值,它可以有四个值.这四个标志可以组合在一起.标志描述数据库中的记录,可以是:

  • 新纪录
  • 删除记录
  • 修改记录
  • 现有记录

现在,对于我希望保留此属性的每条记录,我可以使用枚举:

enum { xNew, xDeleted, xModified, xExisting }
Run Code Online (Sandbox Code Playgroud)

但是,在代码的其他地方,我需要选择哪些记录对用户可见,所以我希望能够将其作为单个参数传递,如:

showRecords(xNew | xDeleted);
Run Code Online (Sandbox Code Playgroud)

所以,似乎我有三个可能的附件:

#define X_NEW      0x01
#define X_DELETED  0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08
Run Code Online (Sandbox Code Playgroud)

要么

typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Run Code Online (Sandbox Code Playgroud)

要么

namespace RecordType {
    static const uint8 xNew = 1;
    static const uint8 xDeleted = 2;
    static const uint8 xModified = 4;
    static const uint8 xExisting = 8;
}
Run Code Online (Sandbox Code Playgroud)

空间要求很重要(字节与整数),但并不重要.使用定义我失去了类型安全性,并且enum我失去了一些空间(整数),并且当我想要进行按位操作时可能需要进行转换.随着 …

c++ enums bit-manipulation c-preprocessor

123
推荐指数
6
解决办法
6万
查看次数

sizeof(enum)== sizeof(int),总是吗?

sizeof(enum)== sizeof(int),总是吗?

  • 还是编译器依赖?
  • 这是错误的,因为编译器针对字长度(内存对齐)进行了优化,即y int是特定编译器上的字大小?如果我使用枚举,这是否意味着没有处理惩罚,因为它们将是字对齐的?
  • 如果我将所有返回代码放在枚举中是不是更好,因为我显然不担心它获得的值,只检查返回类型时的名称.如果是这种情况,#DEFINE会更好,因为它可以节省内存.

通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端完成某些处理,那么您更喜欢枚举/ #define/const ints.

编辑 - 只是检查网络,因为编译器不象征性地链接宏,人们如何调试,比较整数值与头文件?

来自答案 - 我在下面添加这一行,因为我需要澄清 -

"因此它是实现定义的,而sizeof(枚举)可能等于sizeof(char),即1."

  • 这是否意味着编译器检查枚举中的值范围,然后分配内存.我不这么认为,当然我不知道.有人可以解释一下"可能是什么".

c enums const c-preprocessor

58
推荐指数
4
解决办法
6万
查看次数

是什么让C,宏或枚举更好?

我很困惑何时使用宏或枚举.两者都可以用作常量,但它们之间有什么区别,哪一个有什么优势?它是否与编译器级别有关?

c macros enums

34
推荐指数
5
解决办法
2万
查看次数

在C中指定枚举类型的大小

已经阅读了这个相关的问题,但正在寻找一些更具体的东西.

  • 有没有办法告诉你的编译器具体你想要你的枚举有多宽?
  • 如果是这样,你怎么做?我知道如何在C#中指定它; 它在C中同样完成了吗?
  • 它甚至值得做吗?当枚举值传递给函数时,是否会将其作为int-sized值传递?

c optimization enums word-size

30
推荐指数
8
解决办法
5万
查看次数

不管枚举值的数量,常量枚举大小

enum无论类型中的枚举数是多少,为什么总是2或4个字节(分别在16位或32位架构上)的大小?

编译器是否enum像它那样对待union

c c++ enums

12
推荐指数
3
解决办法
9700
查看次数

不同编译器的枚举大小(以字节为单位)

enum的大小在不同的编译器(gcc,visual c和其他?)中总是相同的.也就是说,特定枚举的sizeof()是否为遵循C/C++标准的每个编译器提供相同的值?

c c++ compiler-construction enums

10
推荐指数
1
解决办法
1300
查看次数

有没有办法声明一个函数参数来接受一个匿名枚举?

如果我有一个匿名枚举,是否有任何方法可以将该类型的值传递给函数?例如,

typedef struct {
    enum { On, Off } status;
    int max_amps;
} SWITCH;

void make_switches(){
    SWITCH switch1 = createSwitch( On, 15 );
    SWITCH switch2 = createSwitch( Off, 20 );
}

SWITCH* createSwitch( ??? status, int max_amps ){
    SWITCH* new_switch = malloc( sizeof( SWITCH ) );
    new_switch->status = status;
    new_switch->max_amps = max_amps;
    return new_switch;
}
Run Code Online (Sandbox Code Playgroud)

我想将匿名枚举的值传递给createSwitch()函数。有什么办法吗?

c enums

8
推荐指数
1
解决办法
198
查看次数

将枚举定义转换为unsigned int

根据这篇SO帖子:
C中枚举的大小是多少?
枚举类型有signed int类型.

我想将枚举定义从转换signed intunsigned int.

例如,在我的平台上,a unsigned int是32位宽.我想创建一个枚举:

typedef enum hardware_register_e
{
    REGISTER_STATUS_BIT = (1U << 31U)
} My_Register_Bits_t;
Run Code Online (Sandbox Code Playgroud)

我的编译器抱怨上面的定义超出范围(它用于a signed int).

我如何申报unsigned int enum价值?

编辑1:

  1. 首选项不是扩展到64位(因为代码驻留在嵌入式系统中).
  2. 由于技能限制,此项目不允许使用C++.:-(

编辑2:

  • 编译器是ARM​​7的IAR Embedded Workbench.

c enums casting iar unsigned-integer

7
推荐指数
1
解决办法
4万
查看次数

在枚举之间选择还是在C中定义?

我注意到大多数预定义值libc都是使用#define指令编写的.例如,whence参数取一个intin fseek(从我的知识)一个enum会更好.有很多这样的例子显然应该出于某种原因(除了后兼容性问题).

所以,我想知道在这种情况下是它更好地使用#define,而enum类型安全的替代方案更容易被发现.

作为一个实际例子,考虑typedef表示输入/输出通道,因为它可能是内核的情况.gpio可以在输入或输出中配置.enum在这里使用指令是否值得?

typedef struct gpio {
    size_t port; 
    size_t bit;
    enum { DIR_INPUT, DIR_OUTPUT } direction; // or `bool`?
    bool value;
} gpio;
Run Code Online (Sandbox Code Playgroud)

请注意,enum可以通过三种不同的方式实现:

i)类型:

typedef enum gpio_direction {   
   DIR_OUTPUT
   DIR_INPUT
} gpio_direction;
Run Code Online (Sandbox Code Playgroud)

ii)全球枚举

enum gpio_direction {   
   DIR_OUTPUT
   DIR_INPUT
} gpio_direction;
Run Code Online (Sandbox Code Playgroud)

iii)匿名枚举(如我的例子所示).

c enums casting

7
推荐指数
1
解决办法
391
查看次数

从陷入困境的python进程中获取stacktrace

我必须运行一个传统的Zope2网站,并对此有一些不满.最大的问题是,它偶尔会锁定,以100%的CPU负载运行而不再响应请求.虽然这个问题不能定期重现,但是有时会有一个包含3个动态图形的页面触发它,所以我怀疑某种竞争条件会导致无限循环或陷入忙碌状态.

问题是,我还没有找到调试这个东西的方法.Zope日志中没有任何内容,系统日志中没有任何内容.我尝试了这个问题的建议来获得一个堆栈跟踪,但唯一有效的信号是SIGKILL.

是否还有另一种可能性来确定卡住的过程究竟在哪里?

python debugging zope infinite-loop

6
推荐指数
2
解决办法
6139
查看次数