我有一个C主文件,其中包含此.h文件:
#pragma pack(1)
#ifndef PACKAGE
#define PACKAGE
struct A {
uint8_t a;
uint8_t b;
uint64_t c;
} typedef A;
#endif
编译警告后:
myfile.c:28:10: warning: the current #pragma pack alignment value is modified in
the included file [-Wpragma-pack]
#include "structures.h"
^
./structures.h:1:9: note: previous '#pragma pack' directive that modifies
alignment is here
#pragma pack(1)
出现。
我不明白我的代码有什么问题。有什么办法可以删除此警告?
这是一个完整的示例:
这是一个名为“ myfile.c”的简单C文件:
#include "structures.h"
int main(){
return 0;
}
这是.h文件,称为“ structures.h”:
#include <stdlib.h>
#include <stdio.h>
#pragma pack(1)
#ifndef PACKAGE
#define PACKAGE
struct A {
uint8_t a;
uint8_t b;
uint64_t c;
} typedef A;
#endif
警告是:
myfile.c:2:10: warning: the current #pragma pack alignment value is modified in
the included file [-Wpragma-pack]
#include "structures.h"
^
./structures.h:5:11: note: previous '#pragma pack' directive that modifies
alignment is here
#pragma pack(1)
^
1 warning generated.
答案 0 :(得分:5)
也许您需要阅读有关编译指示的GCC手册— §6.61.10 Structure-Layout Pragmas。您可以明智地使用:
#ifndef PACKAGE
#define PACKAGE
#pragma pack(push, 1)
typedef struct A {
uint8_t a;
uint8_t b;
uint64_t c;
} A;
#pragma pack(pop)
#endif /* PACKAGE */
我不知道这是否适用于所有与您相关的编译器。
偶然地,我将typedef
关键字移到了开头。 C语法将typedef
视为storage class,并且还规定(C11 §6.11.5 Storage class specifiers),存储类说明符的放置位置不在声明说明符的开头,声明是过时的功能。首先输入关键字typedef
!
我还注意到,此标头不是自包含的(尽管由于标头保护,它是幂等的)。它依赖于已经包含的<stdint.h>
(或者也许<inttypes.h>
)。理想情况下,您应该在第一个#include <stdint.h>
之前添加#pragma
,以便即使编译单元中包含的第一个标头也可以编译代码。另请参见Should I use #include
inside headers?