
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

Max
23.05.2018
13:42:56

Constantine
23.05.2018
13:43:26

Сиие
23.05.2018
13:43:27

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

Max
23.05.2018
13:43:50

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

Max
23.05.2018
13:45:28

Сиие
23.05.2018
13:45:52

Max
23.05.2018
13:46:03

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

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

Сиие
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 и наооборот

Сиие
23.05.2018
13:50:34

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 своя копия
и слинкуется

Сиие
23.05.2018
13:56:03

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;
учи матчасть
и да, "проектов" нет в С++. как и ерроров компиляции от того что заинклюдил в два модуля один и тот же хедер. теорию стоит подтянуть.

Сиие
23.05.2018
14:01:36

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

Max
23.05.2018
14:10:01

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

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

Google

Max
23.05.2018
14:14:28

Сиие
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
я и не юзаю. но знаю про такое тк бывает что в проекте уже понаписаны глобалстатиков докучи

Max
23.05.2018
14:21:16
шучу хехе

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

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