Прагма во включенном C-файле - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть главный файл 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)

появляется.

Я не понимаю, что не так в моем коде. Есть ли способ удалить это предупреждение?

Вот полный пример:

Это простой файл C с именем "myfile.c":

#include "structures.h"
int main(){
  return 0;
}

А это файл .h, который называется "структура.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.

1 Ответ

5 голосов
/ 13 апреля 2019

Может быть, вам нужно прочитать руководство GCC по прагмам - §6.61.10 Прагмы макета структуры .Вы могли бы разумно использовать:

#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 как класс хранения , а также предусматривает (C11 §6.11.5 спецификаторы класса хранения ), что размещение спецификатора класса хранения, другогочем в начале объявления спецификаторы в объявлении являются устаревшей функцией .Сначала поставьте ключевое слово typedef! 1017 *

Я также отмечаю, что этот заголовок не является автономным (хотя он является идемпотентным из-за защиты заголовков).Он полагается на то, что <stdint.h> (или, возможно, <inttypes.h>) уже включен.В идеале вы должны добавить #include <stdint.h> перед первым #pragma, чтобы код компилировался, даже если это первый заголовок, включенный в модуль перевода.См. Также Должен ли я использовать #include внутри заголовков?

...