在C中的以下陈述中哪一个更好用?
static const int var = 5;
Run Code Online (Sandbox Code Playgroud)
要么
#define var 5
Run Code Online (Sandbox Code Playgroud)
要么
enum { var = 5 };
Run Code Online (Sandbox Code Playgroud) 我正在创建一组枚举值,但我需要每个枚举值为64位宽.如果我没记错的话,枚举通常与int的大小相同; 但是我认为我读过某个地方(至少在GCC中),编译器可以使枚举成为保持其值所需的任何宽度.那么,有可能有一个64位宽的枚举?
在我正在研究的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我失去了一些空间(整数),并且当我想要进行按位操作时可能需要进行转换.随着 …
我很困惑何时使用宏或枚举.两者都可以用作常量,但它们之间有什么区别,哪一个有什么优势?它是否与编译器级别有关?
我的基本情况:我有一个类似的包含文件#define foo (Flag1 | Flags2 | Flag3),所以它是一个预定义的位标志组合.为了类型安全,我想用静态consts替换这些#defines,即static const int foo = (Flag1 | Flag2 | Flag3)(或类似).这个包含文件包含在程序的许多地方.
现在当我在启用所有相关优化选项的发布版本时(使用VS2010的C++编译器),替换#defines似乎会将可执行文件增加几个KiB,具体取决于我替换了多少常量.
为什么会这样?据我所知,整数常量应该被"内联"到尽可能产生的ASM代码中,我不知道使用static constvs #define会如何在这里产生影响.很明显,变量没有内联,因为反汇编显示:
#define:
01325041 or eax,0FFD87FE0h
static int:
011E5451 or eax,dword ptr [CMainFrame::s_TemplateModulePaths+38h (151F008h)]
Run Code Online (Sandbox Code Playgroud)
所以最后一个问题是:我如何避免#define但仍然依赖于直接插入到生成的程序集中的变量?
我正在尝试使用C和汇编(intelx8086)语言.
我也在使用一个班级,我的一个朋友给了我一个
typedef enum data_10 {a=0,b=7,c=10,} data_10_type;
Run Code Online (Sandbox Code Playgroud)
我想按位使用这个类(AKA构造它/在Assembly上销毁它).我的问题是,"枚举"需要多少内存?