предупреждение ... определено, но не используется - мне действительно нужен файл .c? - PullRequest
0 голосов
/ 14 ноября 2011

Я обнаружил, что Apple использует следующее объявление в заголовке OSAtomic.h:

inline static int32_t   OSAtomicDecrement32( volatile int32_t *__theValue )
            { return OSAtomicAdd32( -1, __theValue); }

При включении и компиляции я получаю следующее предупреждение:

warning: 'int32_t OSAtomicDecrement32(volatile int32_t*)' defined but not used

Это правда, но я хотел бы знать ответы на следующие вопросы:

  1. Действительно ли им нужно, чтобы этот символ был определен в какой-то библиотеке (чтобы избавиться от этого предупреждения)? Если функция OSAtomicDecrement32 может быть создана только путем вызова OSAtomicAdd32, почему нельзя определить это непосредственно в заголовке? Должны ли они вместо этого использовать #define OSAtomicDecrement32 ... body ..

  2. Если я не вызываю OSAtomicDecrement32 в моей программе, почему он жалуется, что символ OSAtomicAdd32 не определен (когда я не связываюсь с библиотекой, которая его определяет)? Это встроенное, я думал, что когда я не использую что-то, компилятор удалит это ...

Спасибо, что объяснили мне!

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Полагаю, причиной, по которой gcc жалуется на это, является ключевое слово static, которое приводит к тому, что код этой функции выводится в любом модуле компиляции. Они просто не должны делать это так. Либо они будут использовать

  • очистить стандартный код C99. Тогда им просто нужно обойтись inline без static и предоставить символ только в одной библиотеке, например, libc
  • использовать расширения компилятора, такие как атрибут gcc (и, следовательно, clang) always_inline

но никогда static.

Кстати, у gcc есть расширение для этих операций (с префиксом __sync IIRC), которое будет переносимым на другие системы, где есть gcc, clang, icc, opencc ...

Возможно, вы могли бы обойти это, добавив некоторые аргументы в вызов gcc. Попробуйте -std=c99 или выключите соответствующее предупреждение.

0 голосов
/ 14 ноября 2011

В предупреждающем сообщении не говорится, что OSAtomicDecrement32 не определено, скорее наоборот. Сообщение говорит вам, что есть функция, которая определена, но вы не вызываете ее. Если это из внешней библиотеки, то не о чем беспокоиться, а если это в вашем собственном коде, то, возможно, вы просто еще не написали код для его вызова.

...