我试图用宏定义一个'变量',以后可以用作常量值…我现在已经没有主意了,想知道有没有人能告诉我,如果我错过了什么:
这是我最初编写的,但是C不识别'name'作为常量qv。编译错误C2099:初始化器不是常量
#define DECL(name,value) static const unsigned long int name = value
DECL(FOO, 0xFFFFFFFF)
我的下一个尝试是写一个宏,将为我#定义值…但是编译器抱怨嵌入的#:"error: '#'后面没有宏参数"qv。在#define宏中转义#符号?
#define DECL(name,value) #define name (value)UL
DECL(FOO, 0xFFFFFFFF)
在^-this-^链接,ybungalbill声称v-this-v工作…但是它没有
#define DECL(hash, name, value) hash define name (value)UL
DECL(#, FOO, 0xFFFFFFFF)
我设法让我的代码编译这个枚举技巧(灵感来自第一个链接)…它可以在我的计算机上运行,但由于这个问题最终是关于创建可移植代码(可在语言和平台之间移植)!我担心这个值的大小和符号是否正确。qv。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 - %dn", 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中一样),可能会更有意义,但事实并非如此。
您的问题与宏没有任何关系。
我正在尝试定义一个"变量"[…]],以后可以用作常量
不能这样做,因为这个变量可以用作初始化器。
它仍然是一个变量。
进一步阅读:错误"初始化项元素不是常量"当尝试使用const