具有内存大小定义的标头

时间:2013-04-16 07:47:30

标签: c++ c size header-files c-preprocessor

是否有标准的C / C ++标头,其定义为byte,kilobyte,megabyte,......? 我不想做自己的定义。在我看来这很脏。

示例:

if (size > MEGABYTE)
{ ... }

4 个答案:

答案 0 :(得分:12)

不,没有这样的标准定义。可能是因为附加值非常小。

您经常会看到以下内容:

#define KB(x)   ((size_t) (x) << 10)
#define MB(x)   ((size_t) (x) << 20)

这使用左移表示操作 x * 2 10 ,它与 x * 1,024相同,并且相同2 20 ,即1,024 * 1,024,即1,048,576。这“利用”了千字节,兆字节等经典定义在计算中使用2的幂的事实。

size_t的强制转换是好的,因为这些是大小,我们希望它们可以作为参数用于例如malloc()

使用上述内容,在代码中使用它们变得非常实用:

unsigned char big_buffer[MB(1)];

或     if(statbuf.st_size&gt; = KB(8))     {       printf(“文件为8 KB(或更大)\ n”);     }

但你当然可以用它们来做进一步的定义:

#define MEGABYTE MB(1)

答案 1 :(得分:5)

正如其他答案指出的那样,没有。 C ++ 11中一个很好的解决方案是使用用户定义的文字:

constexpr std::size_t operator""_kB(unsigned long long v) {
  return 1024u * v;
}

std::size_t some_size = 15_kB;

答案 2 :(得分:2)

没有。但是你为什么不自己制造它们呢?

const unsigned long BYTE     = 1;
const unsigned long KILOBYTE = 1024;
const unsigned long MEGABYTE = 1024 * 1024;
const unsigned long GIGABYTE = 1024 * 1024 * 1024;

以及

const unsigned long long TERABYTE = 1024ULL * 1024 * 1024 *1024;

Read more...

答案 3 :(得分:0)

并不是说它增加了很多,但是我很喜欢这种形式:

#define KILOBYTES * 1024UL
#define MEGABYTES * 1048576
#define GIGABYTES * 1073741824UL

您可以使用like

    if (size > 10 MEGABYTES) { ...