Екі .c бастапқы файлында пайдалану үшін статикалық функцияны қалай жасауға болады?

Мен статикалық функцияның анықтамасын екі бастапқы файлға (сол модульге) қоюды қаламаймын,

себебі бұл қайталанатын.

Сондай-ақ, оны статикалық деп жариялауға тура келеді, себебі оны басқа модульдер пайдалануды қаламаймын.

Не істеуім керек?

0

5 жауаптар

Функция тақырыбын үстіңгі деректеме файлына (.h) қойыңыз .. жақсы C үйренуін ұсынуға бола ма?

3
қосылды
Әрине, бұл қайталануды тудырмайды деп ойлайсыз ба? Әр компиляциялық бірліктің анықтамасын жасау керек.
қосылды автор new_perl, көзі
Мен статикалық функцияны тек екі арнайы көздер файлымен бөліскім келеді, бұл менің сұрағым.
қосылды автор new_perl, көзі
Бұл әдеттегі орналасуды модульдеуге тырысқанда жиі кездеседі.
қосылды автор new_perl, көзі
Жоқ, сіз тақырыптағы қолтаңбаны сақтайсыз, сілтемеуші оны табады және оған сілтеме жасайды. Егер сіз оны бөлек файлдарда қолдансаңыз, бұл әрекеттерді орындау тәсілі.
қосылды автор Kieren Johnstone, көзі
«Мен банан сияқты дәмі бар алма алғым келеді» ...
қосылды автор Kieren Johnstone, көзі
@new_perl C модуляризациясы өте шектеулі. бұл есіңізде сақтаңыз. Егер сізге бұл қажет болса, функцияны .h (or.c немесе .whatever) файлына қоясыз және сіз бұл файлды тек қалаған екі бастапқы файлда ғана қосасыз. Бұл кодтың қайталануына әкеледі бірақ статика функциясын жариялағаныңызда сілтеме қателері болмайды.
қосылды автор nos, көзі
Кілт сөз static болды.
қосылды автор Michael Krelin - hacker, көзі
Жоқ, ол мәлімдейді, бірақ ол символды анықтай алмайды.
қосылды автор Michael Krelin - hacker, көзі

Бұл бір-біріне тән ерекше талаптар сияқты көрінеді; сіз екі аударма бірліктері арасында ортақ пайдаланылатын функцияны бір іске қосуды қаласаңыз, бірақ оны басқа аударма бірліктеріне көрінбейтін етіп static деп жариялағыңыз келеді. Өкінішке орай, C осындай түйіршіктілік ұсынбайды; нышан басқа барлық аударма бірліктеріне көрінеді немесе ол жоқ.

анықтамасы функциясын тақырып файлына (статикалық деп жарияланды) қойып, оны қажет ететін бастапқы файлдарға #include енгізу арқылы жалған болады.

#ifndef FUNC_H
#define FUNC_H

static void func() {...}

#endif

Мәселен, осы файлды қамтитын әрбір аударма бірлігі функцияның артық орындалуына ие болады. Бұл сіз үшін үлкен келісім болмауы мүмкін.

Мен жеке функцияны әдетте өз аударма бірлікте жариялаймын, тақырыпты жасай аламын, тек осы функцияға қоңырау шалу қажет файлдардағы тақырыпты қосыңыз және бұл функция тек тек болуы керек осы файлдардан шақырылған.

1
қосылды

Статикалық кілт сөздің негізгі мақсаты бағдарламаның бүкіл мерзімі ішінде болатын нысанды жасау болып табылады. Алайда, файлдар кеңістігінде жарияланған барлық нысандар («жаһандық») статистикалық болып табылмаса да, қарамастан: оларда бар.

Бірақ бұл сондай-ақ объектіге жарияланған көлемнен тыс кіру мүмкін еместігін білдіреді. Функциялар файл ауқымында жарияланады («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
қосылды

Егер функция қысқа немесе қарапайым болса, тақырыпты static inline функциясы ретінде анықтауға болады (оның денесін беру), мысалы:

/* in header.h */

static inline int sum3 (int a, int b, int c) {a + b + c қайтару; }

Бірақ сіз шын мәнінде C. бағдарламалау бойынша жақсы кітапты оқып шығуыңыз керек.

0
қосылды
Бұл әдеттен тыс тәжірибе ... Және ол C99 ғана жұмыс істейді.
қосылды автор Lundin, көзі
Бірақ ескі C стандартын практикада қолдануға ешқандай себеп жоқ (кем дегенде оқу кезінде).
қосылды автор Basile Starynkevitch, көзі

Бірдей модульдегі екі файл арқылы не айтқыңыз келетінін білмейсіз, бірақ статикалық функцияның мәні олардың ауқымы файлмен шектелуі болып табылады, сондықтан ең жақсысы #include бір файлды екіншісін бір-бірімен байланыстырудың орнына. Егер мен сіздің құқығыңыз болса ...

0
қосылды
Сіз мені шатастырып жатырсыз. Статикалық функцияны тақырыппен файлға айқындауға болады, бұл жағдайда сіз оны екеуінде де анықтай аласыз. Бір файлды екіншісіне де қол жетімді етіп, оларды бір шақыруда құрастыруға болады. Яғни файлдарды бөліп шығару тек қана ыңғайлы болу үшін физикалық болып табылады (мұны жасамаймын). Немесе оны статистикалық емес етіп жасауға болады.
қосылды автор Michael Krelin - hacker, көзі