我正在尝试定义一个'变量'用一个宏,以后可以用作一个恒定的价值......我现在已经没想到了,想知道是否有人可以告诉我,我是否错过了任何东西:
这是我最初的编码,但C不承认' name'作为常数 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和签名的价值。 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));
}
答案 0 :(得分:2)
宏定义不能包含预处理程序指令,因此您无法#define
扩展到另一个#define
的内容。
C中的const
关键字并不代表"常数&#34 ;;它意味着"只读"。 A"常数"表达式是可以在编译时计算的表达式。 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中那样),它可能更有意义,但它不是。
答案 1 :(得分:0)
您的问题无论如何都与宏无关。
我正在尝试定义一个'变量' [...]以后可以用作常数值
在这个变量可以用作初始化器的意义上,你不能这样做。
它会保持变数。
进一步阅读:Error "initializer element is not constant" when trying to initialize variable with const