LINUX.ORG.RU
решено ФорумTalks

а шотакое file-static function?


0

0

If you have a method in a class that does not access any members and therefore does not need an object to operate, make it static. If additionally it is a private helper function that is not needed outside of the file, make it a file-static function. That hides the symbol completely.

★★

Ответ на: комментарий от anotheranonymous

как это - не может?

Class.h:

class Class: public BaseClass {
public:
    Class() : BaseClass() { }
    static function();
};
разве функицю function никто не сможет заюзать? Или я неправильно понял, что такое модуль?

name_no ★★
() автор топика
Ответ на: комментарий от anotheranonymous

> А при чем тут класс? Ты про file-static function спрашивал же.

я же процитировал в ОП: если у вас в классе метод ... если он к тому же private helper, сделайте его file-static. Ткните лучше, где почитать, что это вообще значит.

name_no ★★
() автор топика
Ответ на: комментарий от name_no

я же процитировал в ОП: если у вас в классе метод ... если он к тому же private helper, сделайте его file-static. Ткните лучше, где почитать, что это вообще значит.

Обычная статическая ф-я безотносительно объекта. Что тут ещё читать то :-?

static void
foo()
{
    ........
}
bibi
()
Ответ на: комментарий от bibi

static void foo() - это в *.h писать? И почему кто-то не сможет использовать эту функцию, если подключит заголовок?

name_no ★★
() автор топика
Ответ на: комментарий от name_no

Если функция описана как статик, то ее никто не вызовет за пределами ее родного файла. Никто. Никогда.

jeyc
()
Ответ на: комментарий от name_no

>>static void foo() - это в *.h писать? И почему кто-то не сможет использовать эту функцию, если подключит заголовок?

попробуй, узнаешь.

alex_custov ★★★★★
()

это я такой вопрос любил на собеседованиях задавать — расскажите все значения ключевого слова static

dilmah ★★★★★
()
Ответ на: комментарий от name_no

> static void foo() - это в *.h писать?

писать ее в заголовок — не самая лучшая идея, потому что тогда будет код дублироваться и мультиплироваться.

dilmah ★★★★★
()

Блинн, я понимаю, когда город по умолчанию. Но про язык по умолчанию я еще не слыхал...

svu ★★★★★
()
Ответ на: комментарий от dilmah

>это я такой вопрос __любил__ на собеседованиях задавать — расскажите все значения ключевого слова static

Видимо случилось что-то ужасное, что отбило привычку задавать этот вопрос на собеседованиях :)

mono ★★★★★
()

If additionally it is a private helper function that is not needed outside of the file, make it a file-static function. That hides the symbol completely.

В си плюс плюсах вроде как принято такие функции не объявлять статическими, а выносить в безимянное пространство имён:

namespace {
    void fn() {}
}
Эффект тот же.

Deleted
()
Ответ на: комментарий от svu

> Блинн, я понимаю, когда город по умолчанию. Но про язык по умолчанию я еще не слыхал...

назначаю дефолтным языком програмирования Qt. )))))))))

name_no ★★
() автор топика
Ответ на: комментарий от mono

Видимо случилось что-то ужасное, что отбило привычку задавать этот вопрос на собеседованиях

И хорошо сделало, надо заметить.

Miguel ★★★★★
()
Ответ на: комментарий от name_no

странно, в тексте, часть которого процитирована в ОП написано, что безымянные неймспейсы сакс.

Там не написано, что они сакс. Там написано, что символы внутри безимянного пространства имён всё-таки экспортируется. Судя по всему это особенность реализации в GCC: см. тему, ссылку на которую дал alex_custov чуть выше (я в ней даже участвовал, но забыл =)). В любом случае, и static и namespace {} не позволят использовать символ за пределами текущего модуля трансляции. И кстати с помощью static нельзя «скрыть» целый класс, а с помощью namespace {} - можно.

Deleted
()
Ответ на: комментарий от name_no

странно, в тексте, часть которого процитирована в ОП написано, что безымянные неймспейсы сакс.

http://techbase.kde.org/Development/Tutorials/Common_Programming_Mistakes#Ano...

'Найдите 10ть отличий'

static void foo()
{
}

namespace {
int
bee(int a, int b)
{
    return a * b;
}
};

void ext(int a, int b)
{
    foo();
    bee(a, b);
}
$ readelf -s test.o
Symbol table '.symtab' contains 12 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.cc
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    3
     5: 0000000000000000     6 FUNC    LOCAL  DEFAULT    1 _Z3foov
     6: 0000000000000006    19 FUNC    LOCAL  DEFAULT    1 _ZN36_GLOBAL__N_test.cc_0
     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT    6
    10: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __gxx_personality_v0
    11: 000000000000001a    32 FUNC    GLOBAL DEFAULT    1 _Z3extii
bibi
()

PS: Судя по всему можно поздравить KDE тим с новым активным мембером. Пожелаем же им удачи в грядущем непростом году тигра :)))

bibi
()
Ответ на: комментарий от bibi

если такие как я будут писать КДЕ, удачи не жди. Я вообще, так, почитать залез.

name_no ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.