我正在尝试用宏定义一个“变量”,以后可以将其用作常量值……我现在已经没有想法了,想知道是否有人可以告诉我是否遗漏了什么:
这是我最初编写的代码,但 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();
r
是 const
,这意味着您不能在初始化后修改它,但它不是“常量”(不可能是,因为返回的值通过 rand()
直到运行时才能确定)。
使用常量表达式作为初始值设定项不会改变这一点。 (在 C++ 中是这样。)
在C 中定义命名常量的通常方法是直接将其定义为宏。例如,而不是
#define DECL(name,value) #define name (value)UL
DECL(FOO, 0xFFFFFFFF)
随便写:
#define FOO 0xFFFFFFFFUL
对于 int
类型常量的特殊情况,您可以使用 enum
声明:
enum { max = 1000 };
这定义了一个匿名枚举类型和该类型的常量 max
。 max
是 int
类型的常量。由于历史原因,它是这样定义的;如果 max
是枚举类型(就像在 C 中一样),它可能更有意义,但事实并非如此。
关于c - 用 C 宏定义常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30380202/