作者:Rocky柱子 | 来源:互联网 | 2022-12-02 16:47
在C中,const
不允许使用变量声明数组大小,即使它是变量.例如:这无法在C中编译:
#include
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];
^
但是,在C++中,它运行得很好.
在C++中运行上面的代码.
输出:
$g++ -o main *.cpp
$main
1, 2
要使其在C中运行,必须使用#define
而不是变量.即:
这在C或C++中运行得很好:
#include
#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;
}
在C中运行此代码
因此,在C++中,我几乎总是使用变量而不是#define
声明我的数组大小.我只是使数组大小变量const
,这一切都很好!最近我开始在纯C中进行大量的单片机编程,然而,当我遇到这个错误并找出问题时,一位高级开发人员告诉我使用除#define
-ed常量之外的任何东西都是不好的做法(或者可能是硬编码的数字) )声明数组大小.
这是真的?在C++中使用const
变量而不是#define
在指定数组大小时是不好的做法?如果是这样,为什么?
在C中,显然你坚持#define
:你别无选择.但是在C++中你显然至少有两个选择,那么一个比另一个好吗?使用一个比另一个有风险吗?
有关:
C中文件范围的可变修改数组
static const vs #define <- 这是一个可靠的问题,非常有帮助.这绝对与我的问题有关,但我的问题并不重复,因为虽然它们都是关于const vs #define,但我的问题是一个非常特殊的情况,其中一个选项甚至不能用一种定期的语言工作被认为是C++的一个子集.这是非常不寻常的,并使我的问题成为一个更窄的子集,符合这个其他问题的广泛范围.因此,不重复.
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es31-dont-use-macros-for-constants-or-functions
"static const"vs"#define"vs"enum"
https://en.wikipedia.org/wiki/Variable-length_array#C99
P.W..
6
在这件事上遵循Scott Meyer的建议会很好.从他的书"Effective C++":
第2项:首选consts,enums和inline到#defines.
适用于您的示例的项目摘要.
这个项可能更好地被称为"更喜欢编译器到预处理器",因为它#define
可能被视为它本身不是语言的一部分.这是其中一个问题.
当你做这样的事情时,
#define SIZE 2
SIZE
编辑器可能永远不会看到符号名称; 在源代码到达编译器之前,它可能被预处理器删除.因此,名称SIZE
可能无法输入到符号表中.如果在编译过程中出现涉及使用常量的错误,这可能会造成混淆,因为错误消息可能2
不是指代SIZE
.如果SIZE
在头文件中定义了你没有写,你就不知道它2
来自哪里
,而你却浪费时间跟踪它.此问题也可能出现在符号调试器中,因为您编程的名称可能不在符号表中.解决方案是用常量替换宏:
const double SIZE = 2; // uppercase names are usually for macros, hence the name change
作为语言常量,SIZE
编译器肯定会看到它,并且肯定会输入到它们的符号表中.
✦对于简单常量,首选const对象或枚举到#defines.
✦对于类似函数的宏,首选内联函数为#defines.
另请参阅"第3项:尽可能使用const".有关其用法和使用例外的更多信息.
所以在标题中回答你的问题:
不,使用变量而不是#define
C++ 指定数组大小并不是一个坏习惯.
1> P.W..:
在这件事上遵循Scott Meyer的建议会很好.从他的书"Effective C++":
第2项:首选consts,enums和inline到#defines.
适用于您的示例的项目摘要.
这个项可能更好地被称为"更喜欢编译器到预处理器",因为它#define
可能被视为它本身不是语言的一部分.这是其中一个问题.
当你做这样的事情时,
#define SIZE 2
SIZE
编辑器可能永远不会看到符号名称; 在源代码到达编译器之前,它可能被预处理器删除.因此,名称SIZE
可能无法输入到符号表中.如果在编译过程中出现涉及使用常量的错误,这可能会造成混淆,因为错误消息可能2
不是指代SIZE
.如果SIZE
在头文件中定义了你没有写,你就不知道它2
来自哪里
,而你却浪费时间跟踪它.此问题也可能出现在符号调试器中,因为您编程的名称可能不在符号表中.解决方案是用常量替换宏:
const double SIZE = 2; // uppercase names are usually for macros, hence the name change
作为语言常量,SIZE
编译器肯定会看到它,并且肯定会输入到它们的符号表中.
✦对于简单常量,首选const对象或枚举到#defines.
✦对于类似函数的宏,首选内联函数为#defines.
另请参阅"第3项:尽可能使用const".有关其用法和使用例外的更多信息.
所以在标题中回答你的问题:
不,使用变量而不是#define
C++ 指定数组大小并不是一个坏习惯.
所以回答标题中的Q:不,恰恰相反.