LINUX.ORG.RU

[c][include]Недоумение чайника

 ,


0

0

Предположим, есть проект на няшке с кучей зависимостей. Перед компиляцией препроцессор проходит по всем инклюдам. В некоторых инклюдах есть другие инклюды, ... В общем, все инклюды вместе с программой превращаются в большой plaintext. В результате - БЕЗУМНОЕ количество имен функций и переменных в global name scope. Неймспейсов, модулей, пакетов, объектов нет.

Почему все эти имена из разных инклюдовне конфликтуют?! Как мне теперь называть функции - полюбому такое название уже есть в глобальном пространстве имен?! Как дальше жить!

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

#ifndef MY_SUPER_PUPER_HEADER_FILE_H
#define MY_SUPER_PUPER_HEADER_FILE_H

typdef struct my_type_t my_type_t;

my_type_t* init_my_type();

void print_my_type(const my_type_t* my_type);

void destroy_my_type(my_type_t* my_type);

#endif /* MY_SUPER_PUPER_HEADER_FILE */

// fooster

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

#include "my_type.h"

struct my_type_t
{
/* sexy stuff goes here... */
};

my_type_t* init_my_type()
{
    my_type_t *t = malloc(sizeof *t);
    if(!t)
    {
        return NULL;
    }

    /* fill in my sexy stuff here */

    return t;
}

void print_my_type(const my_type_t* my_type)
{
     /* print my sexy stuff here */
}

void destroy_my_type(my_type_t* my_type)
{
    /* deinit my sexy stuff here */

    free(my_type);
}

// brihod

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

>>// fooster

>>// brihod

Вы не шутите? Сейчас попробовал объявить функцию внутри структуры, оказывается - нельзя ) А если нужно тысячи функций? Все в один неймспейс пихать? А все разработчики используют этот все_в_одну_структуру_пихнуть стиль?

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

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

/* my_type.h */

#ifndef MY_TYPE_H
#define MY_TYPE_H

typedef struct my_type_t my_type_t;
typedef struct my_type_interface_t my_type_interface_t;

my_type_t* my_type_create();
void my_type_destroy(my_type_t *type);

my_type_interface_t* my_type_get_interface(my_type_t *type);

struct my_type_interface_t
{
    int (*get_data)(my_type_t *type);
    void (*set_data)(my_type_t *type, int data);

    void (*print)(my_type_t *type);
};

#endif /* MY_TYPE_H */

/* my_type.c */

#include "my_type.h"

struct my_type_t
{
    int data;

    my_type_interface_t iface;
};

static int g_get_data(my_type_t *type)
{
    return type->data;
}

static void g_set_data(my_type_t *type, int data)
{
    type->data = data;
}

static void g_print(my_type_t *type)
{
    printf("data: %d\n"m type->data);
}

my_type_t* my_type_create()
{
    my_type_t *t = malloc(sizeof *t);
    if(!t)
    {
        return NULL;
    }

    t->data = 12345;

    t->iface.get_data = g_get_data;
    t->iface.set_data = g_set_data;
    t->iface.print = g_print;

    return t;
}

void my_type_destroy(my_type_t *type)
{
    free(type);
}

my_type_interface_t* my_type_get_interface(my_type_t *type)
{
    if(!type)
    {
        return NULL;
    }

    return &type->iface;
}

// humwer

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

// humwer Спасибо, humwer, прочитаю, когда принесут чё)

makoven ★★★★★
() автор топика

> Как мне теперь называть функции - полюбому такое название уже есть в глобальном пространстве имен?!

Так и называть. MYNAMESPACE_MyFunction()

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

>>Так и называть. MYNAMESPACE_MyFunction()

>>слово static в объявлениях внутренних функций помогает

Ну, хоть какое-то облегчение =)

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

>>// humwer

Блин, до сих пор не принесли чё

makoven ★★★★★
() автор топика

> есть проект на няшке

И после такого оно рассчитывает на нормальный ответ?

> Как мне теперь называть функции - полюбому такое название уже есть в глобальном пространстве имен?! Как дальше жить!

Раньше люди писали на Фортране проекты на много миллионов строк кода, и не плакали, что идентификаторы могут содержать не более шести букв или цифр. Хватало вполне.

anonymous
()

В реальной жизни столкновения с именами стандартных функций редки, потому что стандарт и разумные прогеры используют на pblic API префиксы - pthtread_, mb, wc, X и т.д.

Кстати, имена типов вроде blabla_t зарезервированы для стандартной библиотеки, и тот, кто их исользует, напрашивается на неприятности.

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

> Кстати, имена типов вроде blabla_t зарезервированы для стандартной библиотеки, и тот, кто их исользует, напрашивается на неприятности.

proof?

// thucks

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

> Кстати, имена типов вроде blabla_t зарезервированы для стандартной библиотеки

в случае коллизии gcc ругнётся.

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

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

>> есть проект на няшке

>И после такого оно рассчитывает на нормальный ответ?

<offtop>

Я тут недавно, и не знаю всех ваших семантических ньюансов, но пучему нельзя говорить "няшка"? Этож от слов nya! kawaii!, а не от шняжки, ня?

</offtop>

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

> Я тут недавно, и не знаю всех ваших семантических ньюансов

И грамматических тоже.

> но пучему нельзя говорить "няшка"?

Главный семантический нюанс - здесь в Development не любят отвечать тем, кто косит под придурковатого подростка-анимешнега.

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

>>в Development не любят отвечать тем, кто косит под придурковатого подростка-анимешнега.

Приму к сведению

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

> но пучему нельзя говорить "няшка"? Этож от слов nya! kawaii!, а не от шняжки, ня?

То есть, вы таки действительно идиот. Вам, стало быть, действительно нет смысла давать нормальные ответы.

Анимешные уроды пусть и дальше на дваче пасутся, тут им еды не будет.

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

>>То есть, вы таки действительно идиот. Вам, стало быть, действительно нет смысла давать нормальные ответы.

А вам бы подружку найти =)

Впрочем, незнаю. У меня раньше к анимешникам и девушкам такое же беспощадно-агрессивное отношение было. Потом само сгладилось как-то. Просто подождать немного надо, ня =) (не анимешник ни в коем случае)

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

> но пучему нельзя говорить "няшка"? Этож от слов nya! kawaii!, а не от шняжки, ня?

чего это в шняжке кавайного?
"Язык Си как острая бритва. Можно порезаться, или сделать операцию" (с) Б. Керниган
то есть, маскот Си-тян, это щито, лоли с тесаком?

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

Умоляю вас, давайте не загрязнять ауру друг другу, анонимус (для этого есть двач!). Впредь обещаю не использовать даже намеки на любое арго на ЛОРе, в особенности в Development

Кстати, если кто, как и я не знает что такое арго, вот ссылка http://ru.wikipedia.org/wiki/Арго

Счастья вам (не лучами)!

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

>>то есть, маскот Си-тян, это щито, лоли с тесаком?

Простите, не могу обсуждать это здесь :(

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

> Я действительно недоумеваю, поскольку раньше писал только на языках с поддержкой модульности. И очень интересно, как выкручиваются разработчики больших вещей на c

ну почитай исохдники какого-нибудь там gtk

имхо в большинстве случаев тупо добавляют уникальный префикс к имени функции,
но могу ошибаться, сам не калоед

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

Я действительно недоумеваю. Раньше любил читать только тяжелую научную литературу, и очень интересно, как терпят те, кому приходится читать ландавшица.

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