C - конфликтующие сообщения об ошибках «неявное объявление» и «вложенное внешнее объявление» для существующего и определенного макроса - PullRequest
2 голосов
/ 10 июня 2019

++ = ОБНОВЛЕНИЕ 1 = ++ Выполнение с -E возвращает следующее:

# 100 "/usr/include/sys/byteorder.h" 3
#define BSWAP_64(x) (((uint64_t)(x) << 56) | (((uint64_t)(x) << 40) & 0xff000000000000ULL) | (((uint64_t)(x) << 24) & 0xff0000000000ULL) | (((uint64_t)(x) << 8) & 0xff00000000ULL) | (((uint64_t)(x) >> 8) & 0xff000000ULL) | (((uint64_t)(x) >> 24) & 0xff0000ULL) | (((uint64_t)(x) >> 40) & 0xff00ULL) | ((uint64_t)(x) >> 56))
...
#define _LP64 1
...
# 86 "LALCityHash.c" 2
#define bswap_32(x) BSWAP_32(x)
#define bswap_64(x) BSWAP_64(x)
# 117 "LALCityHash.c"
#define UINT4_in_expected_order(x) (bswap_32(x))
#define UINT8_in_expected_order(x) (bswap_64(x))

Похоже, что это делается через CPP.

Полное содержание на https://pastebin.com/u6VU9sie

Источник LALCityHash.c в https://pastebin.com/GfQ3CxBX

- = ОБНОВЛЕНИЕ 1 = -

Я собираю программные пакеты LIGO для SPARC / Solaris и сталкиваюсь с ошибками. LALCityHash.c предоставляет псевдоним для BSWAP_64, который, кажется, не справляется с необходимыми ключами #include, содержащимися в неизмененном коде.

Я пытался увидеть, помогает ли переопределение определений в другом месте только в том случае, если строки "#iffined (__ sun) || определенные (sun)" не анализируются. Даже удаление .h включает использование необходимого кода локально, чтобы файл не работал. Я просто не могу понять, что я пропускаю.

LALCityHash.c содержит следующие строки:

#elif defined(__sun) || defined(sun)

#define bswap_32(x) BSWAP_32(x)
:87 =>  #define bswap_64(x) BSWAP_64(x) <=
...
:118 => #define UINT8_in_expected_order(x) (bswap_64(x)) <=
...
static UINT8 Fetch64(const char *p) {
:133 =>   return UINT8_in_expected_order(UNALIGNED_LOAD64(p)); <=
}


Выдает обе ошибки ниже:

implicit declaration of function &apos;<b>BSWAP_64</b>&apos;
nested extern declaration of &apos;<b>BSWAP_64</b>&apos;

Файл для ОС ОС Solaris - это sys / byteorder.h и определяется следующим образом:

#if defined(_LP64) || defined(_LONGLONG_TYPE)
#if (!defined(__i386) && !defined(__amd64))
#define BSWAP_64(x) (((uint64_t)(x) << 56) | \
            (((uint64_t)(x) << 40) & 0xff000000000000ULL) | \
            (((uint64_t)(x) << 24) & 0xff0000000000ULL) | \
            (((uint64_t)(x) << 8)  & 0xff00000000ULL) | \
            (((uint64_t)(x) >> 8)  & 0xff000000ULL) | \
            (((uint64_t)(x) >> 24) & 0xff0000ULL) | \
            (((uint64_t)(x) >> 40) & 0xff00ULL) | \
            ((uint64_t)(x)  >> 56))
#else /* x86 */
#define BSWAP_64(x) htonll(x)
#endif  /* !__i386 && !__amd64 */
#else /* no uint64_t */
#define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32))
#endif  /* _LP64 || _LONGLONG_TYPE  */
Making all in utilities
gmake[4]: Entering directory &apos;/export/home/tidytibs/ligo/lal-6.19.2/src/utilities&apos;
  CC       LALCityHash.lo
<b>LALCityHash.c:</b> In function &apos;<b>Fetch64</b>&apos;:
<b>LALCityHash.c:87:21:</b> <b>error: </b>implicit declaration of function &apos;<b>BSWAP_64</b>&apos; [<b>-Werror=implicit-function-declaration</b>]
 #define bswap_64(x) <b>B</b>SWAP_64(x)
                     <b>^</b>
<b>LALCityHash.c:118:37:</b> <b>note: </b>in expansion of macro &apos;<b>bswap_64</b>&apos;
 #define UINT8_in_expected_order(x) (<b>bswap_64</b>(x))
                                     <b>^~~~~~~~</b>
<b>LALCityHash.c:133:10:</b> <b>note: </b>in expansion of macro &apos;<b>UINT8_in_expected_order</b>&apos;
   return <b>UINT8_in_expected_order</b>(UNALIGNED_LOAD64(p));
          <b>^~~~~~~~~~~~~~~~~~~~~~~</b>
<b>LALCityHash.c:87:21:</b> <b>error: </b>nested extern declaration of &apos;<b>BSWAP_64</b>&apos; [<b>-Werror=nested-externs</b>]
 #define bswap_64(x) <b>B</b>SWAP_64(x)
                     <b>^</b>
<b>LALCityHash.c:118:37:</b> <b>note: </b>in expansion of macro &apos;<b>bswap_64</b>&apos;
 #define UINT8_in_expected_order(x) (<b>bswap_64</b>(x))
                                     <b>^~~~~~~~</b>
<b>LALCityHash.c:133:10:</b> <b>note: </b>in expansion of macro &apos;<b>UINT8_in_expected_order</b>&apos;
   return <b>UINT8_in_expected_order</b>(UNALIGNED_LOAD64(p));
          <b>^~~~~~~~~~~~~~~~~~~~~~~</b>
<b>LALCityHash.c:</b> In function &apos;<b>Fetch32</b>&apos;:
<b>LALCityHash.c:86:21:</b> <b>error: </b>implicit declaration of function &apos;<b>BSWAP_32</b>&apos; [<b>-Werror=implicit-function-declaration</b>]
 #define bswap_32(x) <b>B</b>SWAP_32(x)
                     <b>^</b>
<b>LALCityHash.c:117:37:</b> <b>note: </b>in expansion of macro &apos;<b>bswap_32</b>&apos;
 #define UINT4_in_expected_order(x) (<b>bswap_32</b>(x))
                                     <b>^~~~~~~~</b>
<b>LALCityHash.c:137:10:</b> <b>note: </b>in expansion of macro &apos;<b>UINT4_in_expected_order</b>&apos;
   return <b>UINT4_in_expected_order</b>(UNALIGNED_LOAD32(p));
          <b>^~~~~~~~~~~~~~~~~~~~~~~</b>
<b>LALCityHash.c:86:21:</b> <b>error: </b>nested extern declaration of &apos;<b>BSWAP_32</b>&apos; [<b>-Werror=nested-externs</b>]
 #define bswap_32(x) <b>B</b>SWAP_32(x)
                     <b>^</b>
<b>LALCityHash.c:117:37:</b> <b>note: </b>in expansion of macro &apos;<b>bswap_32</b>&apos;
 #define UINT4_in_expected_order(x) (<b>bswap_32</b>(x))
                                     <b>^~~~~~~~</b>
<b>LALCityHash.c:137:10:</b> <b>note: </b>in expansion of macro &apos;<b>UINT4_in_expected_order</b>&apos;
   return <b>UINT4_in_expected_order</b>(UNALIGNED_LOAD32(p));
          <b>^~~~~~~~~~~~~~~~~~~~~~~</b>
cc1: all warnings being treated as errors
gmake[4]: *** [Makefile:586: LALCityHash.lo] Error 1

1 Ответ

1 голос
/ 12 июня 2019

Решено: Похоже, что LALCityHash.c включает в себя Solaris sys / byteorder.h , который имеет определение

#define BSWAP_32(x) (((uint32_t)(x) << 24) | (((uint32_t)(x) << 8) & 0xff0000) | (((uint32_t)(x) >> 8) & 0xff00) | ((uint32_t)(x) >> 24))
#define BSWAP_64(x) (((uint64_t)(x) << 56) | (((uint64_t)(x) << 40) & 0xff000000000000ULL) | (((uint64_t)(x) << 24) & 0xff0000000000ULL) | (((uint64_t)(x) << 8) & 0xff00000000ULL) | (((uint64_t)(x) >> 8) & 0xff000000ULL) | (((uint64_t)(x) >> 24) & 0xff0000ULL) | (((uint64_t)(x) >> 40) & 0xff00ULL) | ((uint64_t)(x) >> 56))

и другой определяет как псевдоним

# 86 "LALCityHash.c" 2
#define bswap_32(x) BSWAP_32(x)
#define bswap_64(x) BSWAP_64(x)

Построение здесь не нравится.

Вместо этого, заменив LALCityHash.c"bswap_32 / 64" определения на sys / byteorder.h Определения "BSWAP_32 / 64" работают:

86,87c86,97
< #define bswap_32(x) BSWAP_32(x)
< #define bswap_64(x) BSWAP_64(x)
---
> #define bswap_32(x) (((uint32_t)(x) << 24) | \
>                         (((uint32_t)(x) << 8) & 0xff0000) | \
>                         (((uint32_t)(x) >> 8) & 0xff00) | \
>                         ((uint32_t)(x)  >> 24)) 
> #define bswap_64(x) (((uint64_t)(x) << 56) | \
>                         (((uint64_t)(x) << 40) & 0xff000000000000ULL) | \
>                         (((uint64_t)(x) << 24) & 0xff0000000000ULL) | \
>                         (((uint64_t)(x) << 8)  & 0xff00000000ULL) | \
>                         (((uint64_t)(x) >> 8)  & 0xff000000ULL) | \
>                         (((uint64_t)(x) >> 24) & 0xff0000ULL) | \
>                         (((uint64_t)(x) >> 40) & 0xff00ULL) | \
>                         ((uint64_t)(x)  >> 56))

Я до сих пор не понимаю, как действительный псевдоним #define #define здесь не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...