我编写了一个bash脚本来确定gcc数据类型的大小(例如./sizeof int double输出各自的大小int和double),方法是将每个参数包装在下面的P()宏中,然后编译并运行代码.
#define P(x) printf("sizeof(" #x ") = %u\n", (unsigned int)sizeof(x))
Run Code Online (Sandbox Code Playgroud)
问题是这是相对慢的(需要一整秒!),特别是链接步骤(因为编译-c或-S几乎没有时间,运行输出的二进制文件也是如此).一秒钟本身并不是那么慢,但如果我在其他脚本中使用这个脚本,它会加起来.
是否有更快,更少的迂回方式来找出gcc数据类型使用的大小?
您可以使用autoconf(请参阅: )使用的“负数组大小”技巧AC_COMPUTE_INT。这样,您就不需要链接或执行代码。因此,它在交叉编译时也有效。例如,
int n[1 - 2 * !(sizeof(double) == 8)];
Run Code Online (Sandbox Code Playgroud)
如果出现以下情况,则编译失败:sizeof(double) != 8
缺点是,您可能必须-DCHECK_SIZE=8在命令行中传递或类似的内容,因为可能需要多次传递才能检测到异常值。所以,我不确定这是否会更快-但你也许可以利用它。
编辑:如果您专门使用 gcc,我认为 @wintermute 的评论可能是最好的解决方案。
您只能使用GCC的预处理器来实现标准类型的功能.对于标准类型,有预定义的宏:
__SIZEOF_INT__
__SIZEOF_LONG__
__SIZEOF_LONG_LONG__
__SIZEOF_SHORT__
__SIZEOF_POINTER__
__SIZEOF_FLOAT__
__SIZEOF_DOUBLE__
__SIZEOF_LONG_DOUBLE__
__SIZEOF_SIZE_T__
__SIZEOF_WCHAR_T__
__SIZEOF_WINT_T__
__SIZEOF_PTRDIFF_T__
Run Code Online (Sandbox Code Playgroud)
因此,通过使用如下代码:
#define TYPE_TO_CHECK __SIZEOF_INT__
#define VAL_TO_STRING(x) #x
#define V_TO_S(x) VAL_TO_STRING(x)
#pragma message V_TO_S(TYPE_TO_CHECK)
#error "terminate"
Run Code Online (Sandbox Code Playgroud)
您__SIZEOF_INT__甚至无需启动编译就可以从预处理器本身获取值.在您的脚本中,您可以定义TYPE_TO_CHECK(with -D)到您需要的任何内容并将其传递给gcc.当然你会得到一些垃圾输出,但我相信你可以解决这个问题.
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |