在C语言中,以下哪个语句更好使用?
static const int var = 5;
或者#define var 5
或者enum { var = 5 };
在C语言中,以下哪个语句更好使用?
static const int var = 5;
或者#define var 5
或者enum { var = 5 };
const int const_value = 5;
并不总是定义一个常量值。一些编译器(例如tcc 0.9.26)只是分配了一个名为“const_value”的内存。使用标识符“const_value”您无法修改此内存。但仍然可以使用另一个标识符修改内存:
const int const_value = 5;
int *mutable_value = (int*) &const_value;
*mutable_value = 3;
printf("%i", const_value); // The output may be 5 or 3, depending on the compiler.
#define CONST_VALUE 5
常量是一种唯一的方式,可以定义一个数值,该数值不可被任何方式修改。
#define
也可以通过编辑机器代码进行修改。 - ugoren#define
,因为它是预处理器宏。它在二进制程序中不存在。如果想要修改所有使用CONST_VALUE
的地方,必须逐个修改。 - user2229691#define CONST 5
,然后编写了 if (CONST == 5) { do_this(); } else { do_that(); }
的代码,并且编译器消除了 else
分支。如果要将 CONST
更改为 6,您需要编辑机器码。 - Keith Thompson#define
不是万无一失的。 - ugoren#define
值效果的明智方式。唯一真正的方法是编辑源代码并重新编译。 - Keith Thompson我不认为有一个“永远最好”的答案,但正如Matthieu所说的那样
static const
是类型安全的。然而,我对#define
最大的抱怨是在Visual Studio中进行调试时无法查看变量。它会出现找不到符号的错误。
enum {number_ten = 10};
uint16_t
,但当然这不是一个枚举类型。让用户指定用于表示给定枚举类型的整数类型会很好,但是您可以通过为每个值定义一个#define
和对于uint16_t
的typedef
系列来实现相同的效果。 - Keith Thompson2U < -1L
评估为真,而其他平台则评估为假。我们现在也面临这样一个事实,即一些平台将uint32_t
和int32_t
之间的比较实现为有符号的,而另一些平台则实现为无符号的。但这并不意味着委员会不能定义一个向上兼容的C语言后继版本,其中包括类型的语义在所有编译器上都是一致的。 - supercatenum class
是在C++11中引入的,但普通枚举没有改变。你可能使用的是有问题或不符合规范的编译器吗?无论如何,对于当前的C++(至少从1998年以来)和任何人可能使用的C++编译器,你的答案都是不正确的。 - Keith Thompson#define mymax 100
您不能执行printf("常量地址为%p", &mymax);
。
但是,有一个
const int mymax_var=100
你可以使用printf("常量的地址为%p", &mymax_var);
。
更明确地说,在预处理阶段,定义被替换为其值,因此我们没有任何存储在程序中的变量。我们只有从程序的文本段中使用定义的代码。
然而,对于静态常量,我们有一个被分配在某个地方的变量。对于gcc,静态常量被分配在程序的文本段中。
上面,我想讲述引用运算符,所以将解引用替换为引用。
const
限定符有非常不同的语义。C语言除了枚举常量之外没有符号常量。一个const int
是一个变量。你还混淆了语言和具体实现。没有要求放置对象的位置。甚至对于gcc来说也不是真的:通常它将const
限定的变量放在.rodata
节中。但这取决于目标平台。你指的是取地址运算符&
。 - too honest for this site我们查看了MBF16X上生成的汇编代码... 两种变体在算术运算(例如ADD Immediate)方面产生相同的代码。
因此,对于类型检查,首选const int
而不是旧式的#define
。也许这取决于编译器。因此,请检查您生成的汇编代码。