2

tcc C コンパイラでパック構造体を実行しようとしています。コードは次のとおりで、__attribute __ タグがサポートされている必要があります。

#include <stdio.h>
#include <stdint.h>

typedef struct _test_t{
    char        c;
    uint16_t    i;
    char        d;
} __attribute__((__packed__)) test_t;

int main(){
    test_t x;
    x.c = 0xCC;
    x.i = 0xAABB;
    x.d = 0xDD;

    const char *s = (const char *) & x;

    unsigned i;
    for(i = 0; i < sizeof(x); i++)
        printf("%3u %x\n", i, 0xFF & s[i]);

    return 0;
}

gcc では動作しますが、tcc では動作しません。__attribute __((packed)) と他のいくつかのテストも試しましたが、どれも機能しません。

4

3 に答える 3

2

すでにわかっているように、__attribute__ 拡張機能は構造体のメンバーにのみ適用されるため、それぞれに個別に適用する必要があります。tccこれは、 0.9.26でコンパイルされ、正しい出力で実行される、わずかな変更を加えたコードです。

typedef struct {
    char             c __attribute__((packed));
    unsigned short   i __attribute__((packed));
    char             d __attribute__((packed));
} test_t;

int main(void)
{
    test_t x;

    printf("%zu\n", sizeof(test_t));

    x.c = 0xCC;
    x.i = 0xAABB;
    x.d = 0xDD;

    const char *s = (const char *) &x;

    unsigned i;
    for (i = 0; i < sizeof(x); i++)
        printf("%3u %x\n", i, 0xFF & s[i]);

    return 0;
}

結果:

4
  0 cc
  1 bb
  2 aa
  3 dd

ここで 1 つのキャッチがあります。すでにお気づきかもしれませんが、ヘッダーはありません。正しく記述されたコードには次のものが必要です。

#include <stdio.h>
#include <stdint.h> // then replace unsigned short with uint16_t

ただし、ヘッダーで__attribute__は機能しなくなりました。それが常に起こるかどうかはわかりませんが、私のシステム(CentOS 6)では、まさにそのように動作します。

説明が内部sys/cdefs.hヘッダーにあることがわかったので、次を含みます。

/* GCC has various useful declarations that can be made with the
   `__attribute__' syntax.  All of the ways we use this do fine if
   they are omitted for compilers that don't understand it. */
#if !defined __GNUC__ || __GNUC__ < 2
# define __attribute__(xyz) /* Ignore */
#endif

したがって、関数のようなマクロは、マクロを定義しない__attribute__ため、 の「洗い流された」ものです。開発者と標準ライブラリ (ここでは) の作成者との間で一貫性がないようです。tcc__GNUC__tccglibc

于 2015-02-21T17:08:50.490 に答える
0

TCCのエラーのようです。

これを含む多くの情報源によると、http://wiki.osdev.org/TCC

これはうまくいくはずです:

struct some_struct {
   unsigned char a __attribute__((packed));
   unsigned char b __attribute__((packed));
} __attribute__((packed));

...しかし、うまくいきません。

于 2015-02-20T21:26:02.287 に答える