@ProCxx

Страница 2085 из 2477
Egor
23.05.2018
13:41:32
static int a; в хедере - неглобальная переменная

Сиие
23.05.2018
13:41:55
Max
23.05.2018
13:42:11
линкейдж - internal будет, скоуп - глобальный

Сиие
23.05.2018
13:42:34
откуда у тебя вдруг такие познания и почему я не могу вызвать эту переменную в любом месте?

Google
Constantine
23.05.2018
13:43:26
static int a; в хедере - неглобальная переменная
напишите программу с таким объявления в h файле, подключите к двум цпп и узнайте что второй дефинишн ошибка линкера

Сиие
23.05.2018
13:43:27
Egor
23.05.2018
13:43:30
не будет ошибки для static int a;

Max
23.05.2018
13:43:50
то не тебе было
это я @egorpugin отвечал

Constantine
23.05.2018
13:43:51
вы уже проверили?

Max
23.05.2018
13:44:35
вы уже проверили?
не будет ошибки, он прав - попробуй локально проверь

ошибка линковки будет если убрать static

Egor
23.05.2018
13:45:05
кто участвует в разговоре - вы как будто второй день программируете

Сиие
23.05.2018
13:45:07
Сиие
23.05.2018
13:45:52
оно тут причем?
по тому что нельзя зважды подключить один файл в проект

Google
Max
23.05.2018
13:46:11
мы сейчас про отдельные cpp файлы говорим

test.h: static int foo; a.cpp: #include "test.h" b.cpp: #include "test.h"

Сиие
23.05.2018
13:46:42
мы сейчас про отдельные cpp файлы говорим
из разных проектов? тогда о чём вообще разговор?

Max
23.05.2018
13:46:42
правильно понимаю суть проблемы?

из разных проектов? тогда о чём вообще разговор?
из каких вообще проектов? я что-то пропустил? помоему речь идет о том что у тебя есть два cpp файла, куда инклюдится хедер со static (тот который кейворд в С++) переменной

Сиие
23.05.2018
13:47:34
правильно понимаю суть проблемы?
ну да, получим одну фоо в любом месте программы

Max
23.05.2018
13:47:47
после препроцессинга компилятору попадут два модуля: a.cpp: static int foo; /* rest of a.cpp core */ b.cpp: static int foo; /* rest of b.cpp core */

доступ из a.cpp в foo не будет виден для b.cpp и наооборот

Max
23.05.2018
13:50:56
Сиие
23.05.2018
13:50:57
Max
23.05.2018
13:51:12
хорошо, давай методом Сократа

Сиие
23.05.2018
13:51:19
с хера ли?
а схерали он дважды подключит один файл?

Max
23.05.2018
13:51:25
кто он?

Сиие
23.05.2018
13:51:35
кто он?
линковщик

Max
23.05.2018
13:51:38
gcc a.cpp b.cpp -o out.a

линковщик хедеры не подключает

он о них даже не знает

хедеры инклюдит препроцессор

Google
Сиие
23.05.2018
13:52:46
скомпилишь?

Max
23.05.2018
13:52:54
что скопилить?

Сиие
23.05.2018
13:53:15
то что ты написал

допиши в каждом из файлов принт на &foo

вангую вообще егора при компиляции

если нет ифндефа

Aleksandr
23.05.2018
13:55:13
да компилится всё. у каждого TU своя копия

и слинкуется

Aleksandr
23.05.2018
13:56:31
йеп

Max
23.05.2018
13:56:51
ща скину код

Aleksandr
23.05.2018
13:57:38
статик же тут просто означает, что она не будет торчать наружу TU

Aidar
23.05.2018
13:57:40
Max
23.05.2018
13:58:12
проверил?
/tmp> g++ b.cpp a.cpp /tmp> ./a.out here: 0x561974aad17c there: 0x561974aad174 a.cpp: #include "inc.hpp" #include <iostream> extern void print_there(); int main() { std::cout << "here: " << &foo << std::endl; print_there(); return 0; } b.cpp #include "inc.hpp" #include <iostream> void print_there() { std::cout << "there: " << &foo << std::endl; } inc.hpp static int foo; учи матчасть

и да, "проектов" нет в С++. как и ерроров компиляции от того что заинклюдил в два модуля один и тот же хедер. теорию стоит подтянуть.

Alex
23.05.2018
14:03:33
почему админы в supapro не выносят

Max
23.05.2018
14:05:12
ну вот

вот за это я и переживал

что не будет ли так же две функции статические

Google
Max
23.05.2018
14:05:53
насколько я понял если они внутри класса определены то нет тк инлайн

Egor
23.05.2018
14:05:53
и функции будут

Сиие
23.05.2018
14:06:00
функция это всего лишь указатель

Max
23.05.2018
14:06:23
а говорите "дичь". вот и полезная инфа

Max
23.05.2018
14:06:25
Сиие
23.05.2018
14:06:37
ты сегодня в ударе
а с этим то что не так?

Max
23.05.2018
14:07:45
где будет тело функции?

Max
23.05.2018
14:07:58
в хедере

Max
23.05.2018
14:07:58
в a.cpp или b.cpp? или в хедере прямо?

Max
23.05.2018
14:08:11
в цппшнике то понятно что будет

Max
23.05.2018
14:09:07
тогда по куску кода для каждого TU, думаю если включить LTO какой-то, то линкер их смержит

Pavel
23.05.2018
14:09:07
https://hastebin.com/raw/ofahenabeh

красота

Aidar
23.05.2018
14:09:58
https://hastebin.com/raw/ofahenabeh
А чо ты хочешь порядок не заявляя об этом?

Max
23.05.2018
14:10:01
https://hastebin.com/raw/ofahenabeh
это известная фича. от порядка подачи на илнковку зависит порядок вызова инициализации глобалстатиков

Aidar
23.05.2018
14:10:02
Не бывает такого

Max
23.05.2018
14:13:34
порядок инициализации задан только в пределах TU

Google
Max
23.05.2018
14:14:28
порядок инициализации между TU - unspecified
по факту он совпадает с порядком подачи на линковку для gnu и шланга

Сиие
23.05.2018
14:14:35
ты сегодня в ударе
может я действительно не понимаю что-то в статике(а я уже понял, что не понимаю) но блин, что с функцией не так то? вон у меня один из параметров в библиотецной функции - указатель на функцию, а выглядит он собственно как просто её имя

completeCB - Pointer to a function to be called when this queued operation is complete.

Max
23.05.2018
14:15:10
+ есть attribute((constructor()))

Max
23.05.2018
14:15:21
все равно порядок не задан

Max
23.05.2018
14:15:35
в него можно число вписывать

и по нему сортируются

Max
23.05.2018
14:15:46
разве что так - но это уже не переносимо

Max
23.05.2018
14:15:50
да

Max
23.05.2018
14:15:52
и это не стандарт, да

советую погуглить static initialization fiasco и что умы С++ говорят об этом

просто легко потом себе отстрелить все ноги. да и людям объяснять что модули должны компилиться только в нужном порядке... не практично такую магию юзать

Max
23.05.2018
14:20:35
я и не юзаю. но знаю про такое тк бывает что в проекте уже понаписаны глобалстатиков докучи

redl1ne
23.05.2018
14:23:59
Доброго времени суток. Подскажите пожалуйста, заразился изучением winapi возник вопрос Можно ли не прибегая к написанию драйверов и проч. (Использую только юзермод функционал) написать свои реализации функций из ntdll/kernel32? Ну типа ntwritevirtmem или свой createprocess?) Вопрос наверное тупой но я так и не нашел ответа стоит ли биться или ничего не выйдет

Egor
23.05.2018
14:26:16
функции-то всё равно многие в ядро уходят

Страница 2085 из 2477