Как splint узнает, что моя функция не используется в другом файле?

StackOverflow https://stackoverflow.com/questions/741400

  •  09-09-2019
  •  | 
  •  

Вопрос

Шина выдает мне следующее предупреждение:

encrypt.c:4:8: Function exported but not used outside encrypt: flip
  A declaration is exported, but not used outside this module. Declaration can
  use static qualifier. (Use -exportlocal to inhibit warning)
   encrypt.c:10:1: Definition of flip

Поскольку я вызвал splint только для этого файла, откуда он это знает?

#include        <stdio.h>
#include        <stdlib.h>

int    flip( int a)
{
        int b;
        b = a;
        b ^= 0x000C;
        return b;
}

int     blah(int argc, char    *argv[]) {

        FILE    *fp = NULL, *fpOut=NULL;
        int             ch;
        ch = 20; flip(20); return (ERROR_SUCCESS);
}

Я даже избавился от main, чтобы он никак не мог понять, что файл завершен.Я в полном замешательстве!

Это было полезно?

Решение

Вы могли бы обнаружить это, если бы включили заголовок, который объявлял flip() - как вам и следовало, конечно - тогда splint не стал бы жаловаться.Вы также должны заявить blah() также и в заголовке.

Я не совсем уверен, что это правильное объяснение, потому что blah() не используется вообще (хотя он использует flip()) и вы не упоминаете splint жалуюсь на это.

Тем не менее, хорошей практикой является создание каждой функции (на C) static пока вы не сможете продемонстрировать, что это необходимо за пределами исходного файла, и тогда вы убедитесь, что существует заголовок, который объявляет функцию, и этот заголовок используется в файле, который определяет функцию, и в каждом файле, который использует функцию.

В C ++ 'каждая функция должна быть static' совет становится 'каждая функция должна быть определена в анонимном пространстве имен'.

Другие советы

Поскольку я вызвал splint только для этого файла, откуда он это знает?

Вы ответили на свой вопрос.Вы загрузили один файл в lint, так что lint знает есть только файл, о котором нужно позаботиться (не считая стандартного заголовка includes, конечно).

int flip() не объявлен как static, поэтому его потенциально можно использовать извне.Поскольку вы вызвали splint только с одним исходным файлом, в нем правильно указано, что ваша функция, если она не используется извне, должна быть объявлена статической

Он может сообщать только о том, что он видит.Игнорируйте предупреждение или следуйте инструкциям, чтобы отключить его, если вы знаете лучше, чем то, что там написано.Не думайте, что подобный инструмент обязательно знает вашу программу лучше, чем вы сами.

Если он действительно не предназначен для использования вне файла, вы можете объявить его статическим, и это должно устранить проблему, но он будет недоступен из других файлов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top