По стандарту должно ли это комилироваться ?
От: codelord  
Дата: 31.08.07 09:47
Оценка:
файл ls.h
#include <iostream>
using namespace std;
void f() { cout << "f1" << endl; }
static void f2() { cout << "f2" << endl; }

файл main.cpp
#include "ls.h"
int main() {
 f();
 f2();
}

gcc 4.1 это собирает и вызывает функцию f2 которая static
и на сколько помню говорит о видимости в пределах одного файла ?
спасибо за разъяснения
Re: По стандарту должно ли это комилироваться ?
От: Lorenzo_LAMAS  
Дата: 31.08.07 09:54
Оценка:
C>gcc 4.1 это собирает и вызывает функцию f2 которая static
Какую еще f2 он мог бы вызвать, при наличии только одной из вашего заголовка?
Кстати, f — это потенциальный нарушитель правила одного определения, например если вы включите этот заголовок в два компилируемых файла *.cpp

C>и на сколько помню говорит о видимости в пределах одного файла ?

Кто говорит ? static — да, благодаря ему функция f2 имеет internal компоновку. И если включать ваш заголовок в несколько *.cpp фалов, то это будут "разные" функции f2 — т.е. несколько одинаковых функций, каждая с внутренней компоновкой.

C>спасибо за разъяснения
Of course, the code must be complete enough to compile and link.
Re: По стандарту должно ли это комилироваться ?
От: dupamid Россия  
Дата: 31.08.07 10:23
Оценка:
Здравствуйте, codelord, Вы писали:

C>gcc 4.1 это собирает и вызывает функцию f2 которая static

C>и на сколько помню говорит о видимости в пределах одного файла ?

Тут видимо произошла путаница с файлами препроцессора и единицами транляции. Стандарт говорит, что static функция будет видна в пределах единицы трансляции, которая может состоять из многоих файлов препроцессора. Области видимости "файл препроцессора" не существует в С и С++. Так gcc делает все как и предполагалось.
Re[2]: По стандарту должно ли это комилироваться ?
От: codelord  
Дата: 31.08.07 10:41
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

C>>gcc 4.1 это собирает и вызывает функцию f2 которая static

L_L>Какую еще f2 он мог бы вызвать, при наличии только одной из вашего заголовка?
L_L>Кстати, f — это потенциальный нарушитель правила одного определения, например если вы включите этот заголовок в два компилируемых файла *.cpp

C>>и на сколько помню говорит о видимости в пределах одного файла ?

L_L>Кто говорит ? static — да, благодаря ему функция f2 имеет internal компоновку. И если включать ваш заголовок в несколько *.cpp фалов, то это будут "разные" функции f2 — т.е. несколько одинаковых функций, каждая с внутренней компоновкой.

C>>спасибо за разъяснения


вот здесь например, но вначале видел в другом месте
источник http://lib.jp-net.ru/files/book-c.html?str=14
1.139. Программа на Си может быть размещена в нескольких файлах. Каждый файл высту-
пает в роли "модуля", в котором собраны сходные по назначению функции и переменные.
Некоторые переменные и функции можно сделать невидимыми для других модулей. Для этого
надо объявить их static:
— Объявление переменной внутри функции как static делает переменную статической
(т.е. она будет сохранять свое значение при выходе из функции) и ограничивает ее
видимость пределами данной функции.
— Переменные, описанные вне функций, и так являются статическими (по классу
памяти). Однако слово static и в этом случае позволяет управлять видимостью этих
переменных — они будут видимы только в пределах данного файла.
— Функции, объявленные как static, также видимы только в пределах данного файла.
— Аргументы функции и локальные (автоматические) переменные функции и так сущест-
вуют только на время вызова данной функции (память для них выделяется в стеке
____________________
  • Подробное описание make смотри в документации по системе UNIX.
  • Re[3]: По стандарту должно ли это комилироваться ?
    От: Кодт Россия  
    Дата: 31.08.07 11:57
    Оценка:
    Здравствуйте, codelord, Вы писали:

    C>вот здесь например, но вначале видел в другом месте

    C>источник http://lib.jp-net.ru/files/book-c.html?str=14
    C>[b]1.139. Программа на Си может быть размещена в нескольких файлах. Каждый файл высту-
    C>пает в роли "модуля", в котором собраны сходные по назначению функции и переменные.

    Эта извечная путаница между единицами трансляции и отдельными файлами.
    Единица трансляции состоит из основного файла плюс всех включённых в него с помощью #include. (Препроцессор как бы копипастит содержимое .h-файлов внутрь .c)

    Есть общепринятые соглашения, что отдельные .c|.cpp-файлы — это основные файлы единиц трансляции. Их компилируют по-отдельности, и никогда не инклудят.
    А вот .h|.hpp|.inl — наоборот — только включают, и никогда не компилируют самостоятельно.

    Хотя формальных препятствий к тому, чтобы делать иначе — нет.
    ... << RSDN@Home 1.2.0 alpha rev. 655>>
    Перекуём баги на фичи!
    Re: По стандарту должно ли это комилироваться ?
    От: rg45 СССР  
    Дата: 31.08.07 12:09
    Оценка:
    Здравствуйте, codelord, Вы писали:

    C>файл ls.h

    C>
    C>#include <iostream>
    C>using namespace std;
    C>inline void f() { cout << "f1" << endl; }
    C>static void f2() { cout << "f2" << endl; }
    C>

    C>[snipped]

    Маленькое замечание. Либо определение функции f нужно перенести в cpp-файл, либо объявить ее с ключевым словом inline, иначе, с появлением новой единицы трансляции, включающей в себя ls.h получишь ошибку линковки: "функция f уже определена".
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[2]: По стандарту должно ли это комилироваться ?
    От: codelord  
    Дата: 31.08.07 13:37
    Оценка:
    Здравствуйте, rg45, Вы писали:

    R>Здравствуйте, codelord, Вы писали:


    C>>файл ls.h

    C>>
    C>>#include <iostream>
    C>>using namespace std;
    C>>inline void f() { cout << "f1" << endl; }
    C>>static void f2() { cout << "f2" << endl; }
    C>>

    C>>[snipped]

    R>Маленькое замечание. Либо определение функции f нужно перенести в cpp-файл, либо объявить ее с ключевым словом inline, иначе, с появлением новой единицы трансляции, включающей в себя ls.h получишь ошибку линковки: "функция f уже определена".


    Вопрос по функции f2 а не по f
    понимаю что писать тело функции в h файле плохо.
    Выше есть цитата из книги Богатырева о видимости static функции
    почему же f2 видна или ошибка в книге или у меня в голове
    Re[3]: По стандарту должно ли это комилироваться ?
    От: Daevaorn Россия  
    Дата: 31.08.07 14:36
    Оценка:
    Здравствуйте, codelord, Вы писали:

    C>Выше есть цитата из книги Богатырева о видимости static функции

    C>почему же f2 видна или ошибка в книге или у меня в голове
    Там же(выше) есть описание того, где ты допустил ошибку в логике.
    Re[4]: По стандарту должно ли это комилироваться ?
    От: codelord  
    Дата: 31.08.07 14:51
    Оценка:
    Здравствуйте, Daevaorn, Вы писали:

    D>Здравствуйте, codelord, Вы писали:


    C>>Выше есть цитата из книги Богатырева о видимости static функции

    C>>почему же f2 видна или ошибка в книге или у меня в голове
    D>Там же(выше) есть описание того, где ты допустил ошибку в логике.

    в файле описана static функция и он видна не только в нем??

    можно пример?
    Re[3]: По стандарту должно ли это комилироваться ?
    От: Sergey Россия  
    Дата: 31.08.07 14:55
    Оценка:
    "codelord" <57690@users.rsdn.ru> wrote in message news:2641470@news.rsdn.ru...
    > Здравствуйте, rg45, Вы писали:
    >
    > R>Здравствуйте, codelord, Вы писали:
    >
    > C>>файл ls.h
    > C>>
    > C>>#include <iostream>
    > C>>using namespace std;
    > C>>inline void f() { cout << "f1" << endl; }
    > C>>static void f2() { cout << "f2" << endl; }
    > C>>

    > C>>[snipped]
    >
    > R>Маленькое замечание. Либо определение функции f нужно перенести в cpp-файл, либо объявить ее с ключевым словом inline, иначе, с появлением новой единицы трансляции, включающей в себя ls.h получишь ошибку линковки: "функция f уже определена".
    >
    > Вопрос по функции f2 а не по f
    > понимаю что писать тело функции в h файле плохо.
    > Выше есть цитата из книги Богатырева о видимости static функции
    > почему же f2 видна или ошибка в книге или у меня в голове

    Если тут вместо слова "файл" применить термин "единица компиляции", то путаницы не будет.
    Posted via RSDN NNTP Server 2.1 beta
    Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
    Re[5]: По стандарту должно ли это комилироваться ?
    От: Daevaorn Россия  
    Дата: 31.08.07 14:58
    Оценка:
    Здравствуйте, codelord, Вы писали:

    C>Здравствуйте, Daevaorn, Вы писали:


    D>>Здравствуйте, codelord, Вы писали:


    C>>>Выше есть цитата из книги Богатырева о видимости static функции

    C>>>почему же f2 видна или ошибка в книге или у меня в голове
    D>>Там же(выше) есть описание того, где ты допустил ошибку в логике.

    C>в файле описана static функция и он видна не только в нем??


    C>можно пример?

    Эже не однократно описали тебе различе между единицей трансляции и файлом. А понятия "модуль" в С++ вообще нет.
    И не читай книги по программированию российских авторов, да ещё и написанных в прошлом тысячилетии.
    Re[6]: По стандарту должно ли это комилироваться ?
    От: __AleXX__ Украина  
    Дата: 31.08.07 15:06
    Оценка:
    Просто, я думаю, человек не понимает, что в Си файлы .h не компилируются
    Они просто включаются в текст файлов .с (для с++ — .срр), которые и компилируются на самом деле.

    Таким образом куда включишь .h там новая статическая функция и создастся, а т.к. она видна в пределах файла —
    то и ошибок не должно быть.
    Re[6]: По стандарту должно ли это комилироваться ?
    От: Аноним  
    Дата: 03.09.07 06:32
    Оценка:
    Здравствуйте, Daevaorn, Вы писали:

    D>Здравствуйте, codelord, Вы писали:


    C>>Здравствуйте, Daevaorn, Вы писали:


    D>>>Здравствуйте, codelord, Вы писали:


    C>>>>Выше есть цитата из книги Богатырева о видимости static функции

    C>>>>почему же f2 видна или ошибка в книге или у меня в голове
    D>>>Там же(выше) есть описание того, где ты допустил ошибку в логике.

    C>>в файле описана static функция и он видна не только в нем??


    C>>можно пример?

    D>Эже не однократно описали тебе различе между единицей трансляции и файлом. А понятия "модуль" в С++ вообще нет.
    D>И не читай книги по программированию российских авторов, да ещё и написанных в прошлом тысячилетии.
    Не надо мне тыкать и говорить что делать
    Я попросил пример, если не приводишь лучше не отвечать.
    Re[7]: По стандарту должно ли это комилироваться ?
    От: Аноним  
    Дата: 03.09.07 07:08
    Оценка:
    Здравствуйте, __AleXX__, Вы писали:

    __A>Просто, я думаю, человек не понимает, что в Си файлы .h не компилируются

    __A>Они просто включаются в текст файлов .с (для с++ — .срр), которые и компилируются на самом деле.

    __A>Таким образом куда включишь .h там новая статическая функция и создастся, а т.к. она видна в пределах файла —

    __A>то и ошибок не должно быть.

    Можешь переименовать h в cpp ( по секрету можно и в cc ) результат будет тотже
    И не путай понятия "понимание" и "знание".
    Re[8]: По стандарту должно ли это комилироваться ?
    От: Sergey Россия  
    Дата: 03.09.07 08:08
    Оценка:
    > __A>Просто, я думаю, человек не понимает, что в Си файлы .h не компилируются
    > __A>Они просто включаются в текст файлов .с (для с++ — .срр), которые и компилируются на самом деле.
    >
    > __A>Таким образом куда включишь .h там новая статическая функция и создастся, а т.к. она видна в пределах файла —
    > __A>то и ошибок не должно быть.
    >
    > Можешь переименовать h в cpp ( по секрету можно и в cc ) результат будет тотже
    > И не путай понятия "понимание" и "знание".

    Чего тут непонятного-то? Единица компилляции — файл, поступающий на вход компилятора. Расширение не очень важно (оно всего лишь влияет на дефолтное поведение компилятора). То, что включается в компилируемый файл через #include, отдельной единицей компиляции не является.
    Posted via RSDN NNTP Server 2.1 beta
    Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.