Как создать статическую функцию для использования в двух исходных файлах .c? - PullRequest
0 голосов
/ 28 октября 2011

Я не хочу помещать определение статической функции в два исходных файла (одного и того же модуля),

как дубликат.

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

Что мне делать?

Ответы [ 5 ]

3 голосов
/ 28 октября 2011

Поместите заголовок функции в файл заголовка (.h). Могу ли я предложить вам найти хороший учебник по C?

1 голос
/ 28 октября 2011

Это звучит как взаимоисключающие требования;Вы хотите, чтобы одна реализация функции была разделена между двумя единицами перевода, но вы хотите объявить ее static, чтобы она не была видна другим единицам перевода.К сожалению, C не предлагает такой детализации;символ либо виден всем другим единицам перевода, либо нет.

Вы можете подделать ее, поместив функцию определение в заголовочный файл (объявленный как статический), а затем #include в исходные файлы, которые в ней нуждаются:

#ifndef FUNC_H
#define FUNC_H

static void func() {...}

#endif

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

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

0 голосов
/ 28 октября 2011

Основная цель статического ключевого слова - создать объект, который будет существовать на протяжении всей программы.Но все объекты, объявленные в области видимости файла («глобальные»), ведут себя таким образом, независимо от того, статичны они или нет: они имеют статическую продолжительность хранения .

Но это также означает, чток объекту нельзя получить доступ вне области, где он объявлен.Функции объявляются в области видимости файла («global»), и поэтому статическая функция будет доступна только из того же файла, в котором она объявлена. Поэтому нет смысла объявлять такую ​​функцию внутри заголовка.

Что я думаю вы пытаетесь сделать так:

// function.h
void the_func (void);


// function.c
#include "function.h"

static void the_private_func (void);

void the_func (void)
{
  do_things();
  do_private_things();
}

static void the_private_func (void)
{
  ...
};


// some_caller.c
#include "function.h"

...
the_func();

По крайней мере, это то, что имеет смысл в объектно-ориентированном дизайне.

0 голосов
/ 28 октября 2011

Если функция короткая или простая, вы можете определить ее (указав также ее тело) в заголовочном файле как статическая встроенная функция , например,

/* in header.h */

static inline int sum3(int a, int b, int c) { return a+b+c; }

Но вы действительно должны прочитать хорошую книгу по программированию на C.

0 голосов
/ 28 октября 2011

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

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