c++ - 如何对无符号长数使用宏?

标签 c++ c macros

这是我的代码:

#define MSK 0x0F
#define UNT 1
#define N 3000000000

unsigned char aln[1+N];
unsigned char pileup[1+N];

void set(unsigned long i)
{
    if ((aln[i] & MSK) != MSK ) {
        aln[i] += UNT;
    }
}
int main(void) {}

当我尝试编译它时,编译器会这样提示:

 tmp/ccJ4IgSa.o: In function `set':
 bitmacs.c:(.text+0xf): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON \
 section in /tmp/ccJ4IgSa.o
  bitmacs.c:(.text+0x29): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON\
 section in /tmp/ccJ4IgSa.o
 bitmacs.c:(.text+0x32): relocation truncated to fit: R_X86_64_32S against symbol `aln' defined in COMMON\
  section in /tmp/ccJ4IgSa.o

我觉得可能是N太大了,因为把N改成2000000000也能编译成功,但是我需要3000000000作为N的值。

有人知道吗?

最佳答案

根据您最初的问题:使用整数文字后缀 UL (或类似的)来强制 N 的存储类型:

#define N 3000000000UL

但是,(根据您对 HLundvall 的回答的评论)relocation truncated to fit 错误显然不是因为这个 - 它可能(如 Mystical 和 Matt Lacey 所说)只是太大而不适合在片段中。


顺便说一句,如果你问一个单独的问题来解释你试图用你的大数组完成什么,有人可能会建议一个更好的解决方案(更可能适合内存)

例如:

  • 您的示例代码仅使用所示代码中每个字节的低半字节:您可以将其打包成一半大小(诚然这仍然太大)
  • 根据您的访问模式,您可以将阵列保留在磁盘上并将工作子集缓存在内存中
  • 如果我们知道您需要什么,可能会有更好的整体算法和数据结构

关于c++ - 如何对无符号长数使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978826/

相关文章:

c++ - 如何在 Linux 中使用 c 获取系统代理设置

macros - Lisp 或 Scheme 中是否有整个程序转换宏?

c++ - 关于摆脱样板代码的想法

c++ - 用派生类的类型覆盖函数参数类型

c++ - 无法捕获 c++ 中的异常 : failure to identify exception type

c++ - 是否定义为 C++ 标准算法提供空范围?

c - Doxygen 不一致地扩展 C 宏

c++ - qmake 生成的 Makefile 中缺少 QtWebKit 依赖项

c - 为什么 Win32 HeapReAlloc() 改变值?

c - 为什么我们在将多维数组传递给函数时可以省略它的第一维