c - 用 C 宏定义常量变量

标签 c enums macros constants c-preprocessor

我正在尝试用宏定义一个“变量”,以后可以将其用作常量值……我现在已经没有想法了,想知道是否有人可以告诉我是否遗漏了什么:

这是我最初编写的代码,但 C 无法将“名称”识别为常量 qv。 compile error C2099: initializer is not a constant

#define DECL(name,value)  static const unsigned long int  name = value
DECL(FOO, 0xFFFFFFFF)

我的下一次尝试是编写一个宏来为我定义值...但是编译器提示嵌入式#:“错误:'#'后面没有宏参数” qv。 Escaping a # symbol in a #define macro?

#define DECL(name,value)  #define name (value)UL
DECL(FOO, 0xFFFFFFFF)

在 ^-this-^ 链接中,ybungalobill 声称 v-this-v 有效......但它没有

#define DECL(hash, name, value)  hash define name (value)UL  
DECL(#, FOO, 0xFFFFFFFF)

我设法让我的代码使用这个枚举技巧进行编译(受第一个链接的启发)......它在我的电脑上运行,但由于这个问题最终是关于创建可移植代码[在语言和平台之间可移植! ] 我担心值的 sizeof 和 signed'ness。 qv。 What is the size of an enum in C?

#define DECL(name,value)  enum { name = value } ;
DECL(FOO, 0xFFFFFFFF)

以下是一些可能使用上述 FOO 值的代码行:

int array[FOO];
static const unsigned long int  BAR = FOO + 1 ;
int main (void) {
    unsigned long int  var1 = FOO;
    printf("%d - %d\n", FOO, sizeof(FOO));
}

最佳答案

宏定义不能包含预处理器指令,因此您不能 #define 扩展为另一个 #define 的内容。

C 中的const 关键字并不表示“常量”;这意味着“只读”。 “常量”表达式是可以在编译时求值的表达式。 const 对象是其值不可修改的对象。例如:

const int r = rand();

rconst,这意味着您不能在初始化后修改它,但它不是“常量”(不可能是,因为返回的值通过 rand() 直到运行时才能确定)。

使用常量表达式作为初始值设定项不会改变这一点。 (在 C++ 中是这样。)

在C 中定义命名常量的通常方法是直接将其定义为宏。例如,而不是

#define DECL(name,value)  #define name (value)UL
DECL(FOO, 0xFFFFFFFF)

随便写:

#define FOO 0xFFFFFFFFUL

对于 int 类型常量的特殊情况,您可以使用 enum 声明:

enum { max = 1000 };

这定义了一个匿名枚举类型和该类型的常量 maxmaxint 类型的常量。由于历史原因,它是这样定义的;如果 max 是枚举类型(就像在 C 中一样),它可能更有意义,但事实并非如此。

关于c - 用 C 宏定义常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30380202/

相关文章:

c - fscanf 是否将传递的文件指针向前移动?

c++ - 通过作用域和类型枚举访问元组值失败

c++ - C++ 中空枚举的大小如何为 4?

scala - 隐式宏和黑盒宏

C 链表 - 在内存块中创建节点

c - 如何创建函数,在 C 中没有 typedef 的情况下返回指向另一个函数的指针?

c++ - 如何传递 RGBQUAD 作为参数?

java - 枚举实例可以声明自己的公共(public)方法吗?

c++ - Visual Studio快速替换宏及其定义

c - 字符串作为 C 中带参数的宏