将缓冲区的大小定义为宏或常量是否被认为是不好的做法?
例如:
char buffer[1024];
而不是:
#define BUFF_SIZE 1024 char buffer[BUFF_SIZE];
答案 0 :(得分:6)
一般来说,由于几个原因,“魔术数字”被认为是一种不好的做法
1)如果使用有意义的名称命名常量,它将变为自我记录,从而提高代码的可读性。
2)常数通常不在一个地方使用。考虑一下你用1024个元素定义一个缓冲区的情况,然后在代码的其他地方,你想要遍历它的所有元素(假设sizeof
在那里不可用,例如在某些地方它被转换为a指针)。你会写for (i=0; i<1024...
之类的东西。但是明天你会认为1024
不够大,你想让它变得不同。然后你将不得不在拥有这个数字的所有地方之后追捕,但只有在与缓冲区大小有关的地方。通过命名常量,您可以避免所有这些麻烦,只需在一个地方更改值。从而提高了代码的可维护性。
答案 1 :(得分:2)
说实话,两者都不是最佳做法。在C++
中,建议您使用const
变量,如下所示:
const int BUFF_SIZE = 1024;
char buffer[BUFF_SIZE];
这样您就可以将它们隐藏在名称空间中,或者将它们放在类中。
答案 2 :(得分:1)
这也是一样的。在将代码编译为C / C ++代码之前,编译器将BUFF_SIZE
替换为1024
。
此外,定义总是在命名空间之外。那么最好定义一个常量变量。
答案 3 :(得分:1)
如果记录了您将存储的文本从不超过设定的数量,那么在编译时如何定义缓冲区只是一个品味问题。< / p>
但是,如果缓冲区将包含可在运行时通知文本大小的文本,则不要使用常量 - 使用在运行时返回给您的信息来适当调整缓冲区的大小。
例如,许多处理文件,套接字等的I / O函数会为您提供有关读取的字符数的信息。另一个例子是,各种技术的许多API函数在两种模式下工作,其中第一种模式允许您查询存储信息所需的字符数,第二种模式是实际获取字符。
C ++“最佳”方式是使用std::vector<char>
并在适当的时候调用resize()
。这不仅使您的程序安全,而且灵活。我个人不得不调试从API函数返回的信息超出硬编码缓冲区边界的问题,从而导致悲痛。使用std::vector
可以缓解此问题。
答案 4 :(得分:0)
恕我直言,最佳做法是将包含常量的数据与代码分开。如果在配置文件中包含常量,则可能会发生这些问题。然后,您可以使用类似libconfig的库来读取配置文件一次并在代码中设置值。像这样:
const int bufferSize = cfg.getBufferSize();
char buffer[bufferSize];
cfg是该类的一个对象,用于处理读取配置文件。