C++ 在C+中使用变量而不是`#define`来指定数组大小是否不好+;?(C错误:在文件范围内进行了可变修改)
在C语言中,不允许使用变量声明数组大小,即使它是C++ 在C+中使用变量而不是`#define`来指定数组大小是否不好+;?(C错误:在文件范围内进行了可变修改),c++,c,arrays,compiler-errors,static-initialization,C++,C,Arrays,Compiler Errors,Static Initialization,在C语言中,不允许使用变量声明数组大小,即使它是const变量。例:这无法在C中编译: #include <stdio.h> const int SIZE = 2; int a[SIZE]; int main() { a[0] = 1; a[1] = 2; printf("%i, %i", a[0], a[1]); return 0; } 在C++中,它运行得很好。 输出: $gcc -o main *.c main.c:5:5:
const
变量。例:这无法在C中编译:
#include <stdio.h>
const int SIZE = 2;
int a[SIZE];
int main()
{
a[0] = 1;
a[1] = 2;
printf("%i, %i", a[0], a[1]);
return 0;
}
在C++中,它运行得很好。
输出:
$gcc -o main *.c
main.c:5:5: error: variably modified ‘a’ at file scope
int a[SIZE];
^
$g++ -o main *.cpp
$main
1, 2
要使其在C中运行,必须使用#define
而不是变量。即:
这在C或C++中运行良好:
#include <stdio.h>
#define SIZE 2
// const int SIZE = 2;
int a[SIZE];
int main()
{
a[0] = 1;
a[1] = 2;
printf("%i, %i", a[0], a[1]);
return 0;
}
#包括
#定义大小2
//常数int SIZE=2;
int a[大小];
int main()
{
a[0]=1;
a[1]=2;
printf(“%i,%i”,a[0],a[1]);
返回0;
}
<>所以,在C++中,我几乎总是使用变量,而不是<代码>定义> <代码>,来声明数组的大小。我只是将数组大小变量设置为const
,一切都很好!然而,最近我开始用纯C语言编写很多微控制器程序,当我遇到这个错误并解决了这个问题时,一位高级开发人员告诉我,使用#定义-ed常量(或者硬编码的数字)以外的任何东西来声明数组大小都是不好的做法
这是真的吗?在指定数组大小时,C++中的坏习惯是使用<代码> const <代码>变量而不是<代码>定义< /代码>吗?如果是,原因是什么?
在C语言中,显然你被#define
:你别无选择。但是在C++中,你显然至少有2个选择,所以一个比另一个好吗?<强>使用另一个有风险吗?
相关的:
因为SIZE
被定义为const
变量。在C中,与C++ <代码> const 不同,值不是<强>真常量。它们存储在内存中,可以间接引用和修改(通过修改内存中的内容)。这就是为什么,在C++中,有<代码> const <代码>,允许<代码> const int=2;可以工作,但在C中,即使是const
也不够
C11-§6.7.9/3:
要初始化的实体类型应为未知类型的数组
大小或不是可变长度数组的完整对象类型
类型。
在编译时替换预处理器宏,这就是它工作正常的原因
参考链接:因为SIZE
被定义为const
变量。在C中,与C++ <代码> const 不同,值不是<强>真常量。它们存储在内存中,可以间接引用和修改(通过修改内存中的内容)。这就是为什么,在C++中,有<代码> const <代码>,允许<代码> const int=2;可以工作,但在C中,即使是const
也不够
C11-§6.7.9/3:
要初始化的实体类型应为未知类型的数组
大小或不是可变长度数组的完整对象类型
类型。
在编译时替换预处理器宏,这就是它工作正常的原因
参考链接:在这件事上最好听从斯科特·迈耶的建议。从他的书《有效的C++》中:
第2项:首选常量、枚举和内联线而不是#定义。
适用于您的示例的项目摘要
此项最好称为“首选编译器而非预处理器”
因为#define
可能被视为不属于语言的一部分
就其本身而言。这是它的问题之一
当你这样做的时候
#define SIZE 2
编译器可能永远看不到符号名SIZE
;信息技术
可能在源代码获取之前被预处理器删除
编译程序。因此,可能无法输入名称SIZE
进入符号表。如果在测试过程中出现错误,这可能会令人困惑
编译涉及使用常量,因为错误消息
可能指的是2
,而不是SIZE
。如果尺寸为
定义在一个头文件中,你不知道它在哪里
2
来自,你会浪费时间追踪它。这个问题
也可能出现在符号调试器中,因为名称
您正在使用的编程可能不在符号表中。
解决方案是用常量替换宏:
const double SIZE=2;//大写名称通常用于宏,因此名称更改
作为一个语言常量,SIZE
肯定会被编译器和
肯定会被输入到他们的符号表中
✦ 对于简单常量,更喜欢常量对象或枚举而不是#定义。
✦ 对于类似于宏的函数,更喜欢内联函数而不是#定义
另请参阅“第3项:尽可能使用常量”,了解有关其用法和用法例外的更多信息
因此,要回答标题中的问题:
<强>><强> >,在C++中使用变量而不是<代码> >定义< /代码>不是一个坏的做法。p> 在这件事上,最好听从斯科特·迈耶的建议。从他的书《有效的C++》中:
第2项:首选常量、枚举和内联线而不是#定义。
适用于您的示例的项目摘要
此项最好称为“首选编译器而非预处理器”
因为#define
可能被视为不属于语言的一部分
就其本身而言。这是它的问题之一
当你这样做的时候
#define SIZE 2
编译器可能永远看不到符号名SIZE
;信息技术
可能在源代码获取之前被预处理器删除
编译程序。因此,可能无法输入名称SIZE
进入符号表。如果在测试过程中出现错误,这可能会令人困惑
编译涉及使用常量,因为错误消息
可能指的是2
,而不是SIZE
。如果尺寸为
def