运行程序时报错“Value too large for defined data type”

下列错误,可能是因为在64位上跑32位程序:

Value too large for defined data type

 

此错误对应的出错代码为EOVERFLOW,原因可能是目标文件超过2GB大小。

下列代码可能会导致这个错误出错(为何说是可能,本节最后部分解释):

// g++ -g -o x x.cpp -m32

#include <errno.h>

#include <stdio.h>

#include <string.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

#include <string>

 

int main(int argc, char* argv[])

{

  struct stat st;

 

  if (stat(argv[1], &st) != 0)

  {

    printf("stat failed: %s.\n", strerror(errno));

    return 1;

  }

  else {

    printf("%zd\n", st.st_size);

    return 0;

  }

}

 

改成下列后,运行正常:

// g++ -g -o x x.cpp -m32

#include <errno.h>

#include <stdio.h>

#include <string.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

#include <string>

 

int main(int argc, char* argv[])

{

  struct stat64 st;

 

  if (stat64(argv[1], &st) != 0)

  {

    printf("stat failed: %s.\n", strerror(errno));

    return 1;

  }

  else {

    printf("%zd\n", st.st_size);

    return 0;

  }

}

 

前面说的“可能”,是因为不同机器的编译环境(可理解为默认编译参数)可能并不相同,因此导致结果是可能,原因是宏“-D_FILE_OFFSET_BITS=64”会影响结果,如果定义了,则效果如同最后一段代码,否则报错“Value too large for defined data type”。相关宏:_LARGEFILE64_SOURCE__USE_FILE_OFFSET64,相关LIBC头文件:features.h

一些引用到的第三方库,可能定义了FILE_OFFSET_BITS,使用时需注意,比如:

# grep "FILE_OFFSET_BITS" /usr/include/*/*.h

/usr/include/bits/environments.h:#define __ILP32_OFFBIG_CFLAGS  "-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"

/usr/include/mysql/my_config_x86_64.h:#define _FILE_OFFSET_BITS 64

/usr/include/python2.7/pyconfig-64.h:#define _FILE_OFFSET_BITS 64

/usr/include/python3.4m/pyconfig-64.h:#define _FILE_OFFSET_BITS 64

 

1:查看GCC默认机器相关编译参数

gcc -march=native -c -Q --help=target

 

2:查看GCC默认定义的宏

gcc -posix -E -dM - </dev/null

 

或:

cpp -dM /dev/null

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值