90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
1

В каком файле исходного кода находится функция main?

03.08.2016, 18:02. Показов 3153. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можно ли как-то программно определить в каком файле исходного кода находиться функция main?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2016, 18:02
Ответы с готовыми решениями:

В каком файле находится форма комментариев?
DLE версия 10.5 тема HotGirls. Под каждой записью есть форма комментариев, чекбокс Подписаться на...

В каком заголовочном файле находится delay (BCB6)?
В справочной системе C++ Builder 6 Нашел вот этот пример использования функции clock и выдает...

Как мне узнать по классу в каком файле.h он находится?
Здравствуйте. В среде (java) eclipse , как и в NetBeans, есть возможность импортировать не...

Нужно, чтобы в функции Main файла исходного кода происходил запуск обработки формы
Здравствуйте. Я только начала изучение windows forms и столкнулась со следующей проблемой. Мне...

19
Заблокирован
03.08.2016, 18:12 2
Неа. Это может быть и не main. Имя точки входа можно менять при линковке.
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.08.2016, 18:16 3
Цитата Сообщение от nimazzzy Посмотреть сообщение
Неа. Это может быть и не main. Имя точки входа можно менять при линковке.
Вопрос был не «где находится точка входа», а «где находится функция main».

JIawliet, какая задача решается?
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 18:20  [ТС] 4
Цитата Сообщение от nimazzzy Посмотреть сообщение
Имя точки входа можно менять при линковке
ну тогда немножко исправим вопрос: можно ли определить в каком файле находится функция с определенным именем?

Добавлено через 4 минуты
0x10, да вот думаю как происходит раздельная компиляция объектов std::cin, std::cout... я так понял определяются они один раз в одном файле исходного кода, но тогда как во всех других файлах они только объявляются??? должна быть какая-то конструкция по типу:
C++
1
2
3
4
5
6
7
8
9
10
#ifdef // ???
 
exter cin;
exter cout;
 
#else
 
....
 
#endif
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.08.2016, 18:21 5
Цитата Сообщение от JIawliet Посмотреть сообщение
Можно ли как-то программно определить в каком файле исходного кода находиться функция main?
нельзя.

Цитата Сообщение от JIawliet Посмотреть сообщение
можно ли определить в каком файле находится функция с определенным именем?
нельзя.

но если оч сильно хочется,
вы всегда можете написать функцию,
которая будет отправлять вам по электронной почте
собственное месторасположение.
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.08.2016, 19:00 6
Цитата Сообщение от JIawliet Посмотреть сообщение
но тогда как во всех других файлах они только объявляются?
В моем случае в файле iostream:
C++
1
2
3
4
 60   extern istream cin;       /// Linked to standard input                    
 61   extern ostream cout;      /// Linked to standard output                   
 62   extern ostream cerr;      /// Linked to standard error (unbuffered)       
 63   extern ostream clog;      /// Linked to standard error (buffered)
Найдено тупым
Bash
1
grep -Rl 'extern ostream cout' /usr/include/c++/5/
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 19:06  [ТС] 7
0x10, ну вот, я так понял это хэдер <iostream>? ок, объявления то есть, а определение где?) и как в случаи определения в одном файле исходного кода не происходит переопределения в другом???

Добавлено через 2 минуты
Мы ж в коде не пишем нечто:
C++
1
std::istream cin;
следовательно, эти объекты создаются и определяются сами...
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.08.2016, 19:15 8
Цитата Сообщение от JIawliet Посмотреть сообщение
следовательно, эти объекты создаются и определяются сами...
Пишем hello, world, компилируем, смотрим, с чем слинковано:
Код
$ ldd a.out
	linux-vdso.so.1 =>  (0x00007fffba5fe000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc221482000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc2210bd000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc220db6000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc2217b7000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc220b9f000)
Взгляд должен остановиться на строке:
Код
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc221482000)
Смотрим символы:
Код
$ nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep cin
0000000000308a80 B _ZSt3cin
Деманглинг:
Код
$ c++filt _ZSt3cin
std::cin
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 20:01  [ТС] 9
0x10, хочу кое-что прояснить))) объекты cin, cout создаются в единственном экземпляре на все файлы исходного кода? если да, то я до сих пор не понимаю, почему не происходит переопределение в разных файлах исходного кода одного проекта???
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.08.2016, 20:06 10
Цитата Сообщение от JIawliet Посмотреть сообщение
объекты cin, cout создаются в единственном экземпляре на все файлы исходного кода?
После компиляции нет файлов исходного кода. Есть результирующая сборка. В ней объекты должны иметь не более одного определения.

Цитата Сообщение от JIawliet Посмотреть сообщение
если да, то я до сих пор не понимаю, почему не происходит переопределение в разных файлах исходного кода одного проекта???
По факту других определений нет. В заголовочные файлы уже смотрели: там только объявления.
1
Заблокирован
03.08.2016, 20:13 11
Цитата Сообщение от 0x10 Посмотреть сообщение
Вопрос был не «где находится точка входа», а «где находится функция main».
И что? От этого ответ никак не меняется. Он не найдет ни функцию main, ни точку входа в сорцах.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
03.08.2016, 20:20 12
Цитата Сообщение от JIawliet Посмотреть сообщение
ожно ли как-то программно определить в каком файле исходного кода находиться функция main?
Если эта информация и остается то только в debug info. Если прога скомпилированна под дебаг чисто теоритически эту инфу можно найти и распарсить.
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 21:07  [ТС] 13
0x10, мы немного друг друга не понимаем... вот наглядный пример: есть класс, нужно чтоб объект этого класса был в глобальной области и виден из 2 файлов исходного кода.. мы пишем:
C++
1
2
// first .cpp
SomeClass SomeObject;
C++
1
2
// second.cpp
extern SomeclassSomeObject;
Объекты cin, cout тоже определяются в единственном экземпляре на несколько .cpp, НО в первом .cpp все ясно (объекта cin/cout нет - создать объект), а что во втором????? (как происходит проверка на то что уже создан объект в соседнем .cpp?? понятно, что есть объявление, но почему не происходит определение как и в первом .cpp, что привело б к ошибке ODR! что там за код внутри который определяет, что объект уже создан?????)
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.08.2016, 21:27 14
Цитата Сообщение от JIawliet Посмотреть сообщение
а что во втором?
Они же extern, что не понятно?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 22:36  [ТС] 15
Цитата Сообщение от Croessmah Посмотреть сообщение
Они же extern, что не понятно?

создаем .cpp, подключаем <iostream>, пишем простой "hello word" - в <iostream> только объявления cin / cout / cerr / clog, где-то дальше в дебрях хэдеров создаются эти объекты... все ок, все счастливы...

создаем два .cpp, подключаем к каждому <iostream>, и в первом и во втором файле пользуемся cin / cout: в каком-то из файлов, но только в одном, создаются объекты cin / cout / и т.д. (так как extern присутствует во втором файле все ок, все счастливы)... - нет! во втором файле мы снова идем в дебри хэдеров и на тыкаемся на проверку, которая говорит, что объект уже создан!

я не знаю как еще объяснить... давайте парочку примеров:
Пример 1:
C++
1
2
3
4
5
6
7
8
9
10
// first.cpp
#include "Header.h"
 
//=================================================================
int main ()
{
 
 
    return 0;
}
C++
1
2
// second.cpp
#include "Header.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// header.h
#ifndef HEADER_H
 
#define HEADER_H
 
namespace qwe
{
    class SomeClass
    {  };
 
    SomeClass SomeObject;
}
 
#endif
компилируем - получаем ошибку линковщика: переопределение объекта...
Пример 2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
// first.cpp
#include "Header.h"
 
qwe::SomeClass SomeObject;
 
//=================================================================
int main ()
{
 
 
    return 0;
}
C++
1
2
// second.cpp
#include "Header.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef HEADER_H
 
#define HEADER_H
 
namespace qwe
{
    class SomeClass
    {  };
 
    extern SomeClass SomeObject;
}
 
#endif
компилируем - ура! все работает!
НЕТ! все плохо, мы явно определяем SomeObject в first.cpp, что касается объектов cin / cout - мы никогда их явно не определяем, они определяются в глубинах хэдеров...
А посему там (в хэдерах) происходит какая-то проверка, на то, созданы эти объекты или нет, и я спрашивал все это время именно о этой проверке
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.08.2016, 22:41 16
Цитата Сообщение от JIawliet Посмотреть сообщение
что касается объектов cin / cout - мы никогда их явно не определяем, они определяются в глубинах хэдеров
Не в хедерах, а где-то в библиотеках компилятора.
В заголовках лишь объявление, но нет определения.
Так что да - Вы их не определяете,
они уже определены где-то разработчиками компилятора.
Вы же когда вызываете какую-то библиотечную функцию
не задаетесь вопросом где она определена?
А почему? Почему Вы остановились на объектах?
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
03.08.2016, 22:56  [ТС] 17
Croessmah,
Это грубо говоря выглядит как-то так?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// header.h
#ifndef HEADER_H
 
#define HEADER_H
 
namespace qwe
{
    class SomeClass
    {  };
 
    extern SomeClass SomeObject;
}
 
#endif
C++
1
2
// second.cpp
#include "Header.h"
C++
1
2
3
4
5
6
7
8
9
10
// first.cpp
#include "Header.h"
 
//=================================================================
int main ()
{
 
 
    return 0;
}
C++
1
2
3
4
// то_что_сокрыто_разработчиками.wtf
#include "Header.h"
 
qwe::SomeClass SomeObject;
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
04.08.2016, 00:32 18
Лучший ответ Сообщение было отмечено JIawliet как решение

Решение

Цитата Сообщение от JIawliet Посмотреть сообщение
Это грубо говоря выглядит как-то так?
Да, но всё может быть несколько сложнее.
Из исходников GCC 6:
C++
1
2
3
4
5
6
7
8
9
10
11
//globals_io.cc
//...
  typedef char fake_istream[sizeof(istream)]
  __attribute__ ((aligned(__alignof__(istream))));
  typedef char fake_ostream[sizeof(ostream)] 
  __attribute__ ((aligned(__alignof__(ostream))));
  fake_istream cin;//Тупо массив элементов типа char :)
  fake_ostream cout;
  fake_ostream cerr;
  fake_ostream clog;
//...
C++
1
2
3
4
5
6
7
8
9
10
11
12
//ios_init.cc
//...
ios_base::Init::Init()
{
//...
   new (&cout) ostream(&buf_cout_sync);//placement new
   new (&cin) istream(&buf_cin_sync);
   new (&cerr) ostream(&buf_cerr_sync);
   new (&clog) ostream(&buf_cerr_sync);
//...
}
/...
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.08.2016, 04:11 19
Цитата Сообщение от JIawliet Посмотреть сообщение
что касается объектов cin / cout - мы никогда их явно не определяем, они определяются в глубинах хэдеров
Уже было явно сказано, но повторю: объявления — в библиотеке. В восьмом посте было показано, что в моем случае это libstdc++.so.6.
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
04.08.2016, 04:53 20
Цитата Сообщение от 0x10 Посмотреть сообщение
Уже было явно сказано, но повторю: объявления — в библиотеке. В восьмом посте было показано, что в моем случае это libstdc++.so.6.
Ну и? Все имена которые есть в каждом юните трансляции помещаются в объектный файл, в табличку соответствия имен адресам, и табличку какие имена запрошены при обращении к extern функциям и переменным. Линкер сшивает первые таблички, при коллизиях жутко ругается трехэтажным матом (если конечно это не статик-поля члены шаблонов). Потом начинает заполнять то что нужно по второй таблице из первой. если там чего то не хватает ругается вообще девятиэтажным матом. Если ничего не столкнулось и все нашлось получилась exe в которой таблиц имен уже нет.

Добавлено через 15 минут
Так что если где то в EXE имена функций а тем более имена файлов исходников де то остались, то это debug info если она туда влинкована. Но опять же сомнительно что в debug info есть имена функций, для дебага достаточно имен файлов и номеров строк.
0
04.08.2016, 04:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2016, 04:53
Помогаю со студенческими работами здесь

В каком модуле в python3 находится функция для работы со строками?
ребята, в каком модуле в python3 находится функция для работы со строками?

Как определить в каком файле .lib реализована функция?
Есть один проект. В нем файл .h с прототипами функций и множество .lib-ов, с их реализациями. Я...

В каком файле находится код "Облако тегов" в CMS bitrix
Подскажите, пожалуйста, по какой директории находится файлы стандартного &quot;Облака тегов&quot; в движке...

Как указать определения препроцессора непосредственно в файле исходного кода?
3.Как указать определения препроцессора непосредственно в файле исходного кода?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru