用C宏定义常量变量



我试图用宏定义一个'变量',以后可以用作常量值…我现在已经没有主意了,想知道有没有人能告诉我,如果我错过了什么:

这是我最初编写的,但是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();

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中一样),可能会更有意义,但事实并非如此。

您的问题与宏没有任何关系。

我正在尝试定义一个"变量"[…]],以后可以用作常量

不能这样做,因为这个变量可以用作初始化器。

它仍然是一个变量。

进一步阅读:错误"初始化项元素不是常量"当尝试使用const

初始化变量时

相关内容

  • 没有找到相关文章

最新更新