使用C宏定义常量变量

时间:2015-05-21 17:09:38

标签: c enums macros constants c-preprocessor

我正在尝试定义一个'变量'用一个宏,以后可以用作一个恒定的价值......我现在已经没想到了,想知道是否有人可以告诉我,我是否错过了任何东西:

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

2 个答案:

答案 0 :(得分:2)

宏定义不能包含预处理程序指令,因此您无法#define扩展到另一个#define的内容。

C中的const关键字并不代表"常数&#34 ;;它意味着"只读"。 A"常数"表达式是可以在编译时计算的表达式。 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中那样),它可能更有意义,但它不是。

答案 1 :(得分:0)

您的问题无论如何都与宏无关。

  

我正在尝试定义一个'变量' [...]以后可以用作常数值

在这个变量可以用作初始化器的意义上,你不能这样做。

它会保持变数。

进一步阅读:Error "initializer element is not constant" when trying to initialize variable with const