g ++是否支持scalar_storage_order?

时间:2017-08-09 11:40:43

标签: c++ g++

g ++是否支持sclar_storage_order

我在g ++ 6和g ++ 7中对它进行了测试,但它只是警告并且没有正确处理它。

源代码:

#ifdef __cplusplus
#include <cstdio>
#include <cstdint>
#else
#include <stdio.h>
#include <stdint.h>
#endif

typedef struct {
    uint32_t a;
    uint16_t b;
} __attribute__((scalar_storage_order("big-endian"))) SS;


int main(int argc, char *argv[]) {
    uint8_t raw[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0x11, 0x22 };
    SS* instance = (SS*)raw;
    printf("%x, %x\n", instance->a, instance->b);
    return 0;
}

输出:

gcc-6 source.c && ./a.out
aabbccdd, 1122

g++-6 source.cpp && ./a.out
source.cpp:16:53: warning: ‘scalar_storage_order’ attribute ignored [-Wattributes]
 } __attribute__((scalar_storage_order("big-endian"))) SS;
                                                     ^
ddccbbaa, 2211

1 个答案:

答案 0 :(得分:3)

A patch for the C++ front end was posted,但在合并之前它已在分支上恢复:

------------------------------------------------------------------------
r229934 | ebotcazou | 2015-11-07 19:10:36 +0100 (Sat, 07 Nov 2015) | 8 lines

c-family/
        * c-common.c (handle_scalar_storage_order_attribute): Accept attribute
        in place in C but not in C++.
testsuite/
        * c-c++-common/sso-[1-7].c: Move to...
        * gcc.dg/sso-[2-8].c: ...here.
        * g++.dg/sso-[2-8].C: ... and here.

合并的补丁为C和C ++注册#pragma scalar_storage_order处理程序,但C ++前端未更改为处理由pragma控制的内部global_sso标志,因此目前没有任何支持对于g ++中的这个功能。