АК
Size: a a a
АК
O
$ cat foo.hpp
// Our library header
#include <string>
struct Foo {
Foo() = default;
std::string bar = SOME_MACRO;
void do_magic();
};
$ cat foo.cpp
#include "foo.hpp"
#include <iostream>
void Foo::do_magic() {
std::cout << bar << std::endl;
}
Компилируем её:g++ foo.cpp -shared -DSOME_MACRO=\"something\" -o libfoo.so -fpic
И три разных пользователя по-разному используют библиотеку:$ cat first.cpp
#include "foo.hpp"
int main() {
Foo foo;
foo.do_magic();
}
$ g++ first.cpp -o first -DSOME_MACRO=\"something\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./first
something
$ g++ first.cpp -o second -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./second
something wrong
$ cat third.cpp
#include "foo.hpp"
int main() {
Foo foo{"booom!"};
foo.do_magic();
}
$ g++ third.cpp -o third -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./third
booom!
O
$ cat foo.hpp
// Our library header
#include <string>
struct Foo {
Foo() = default;
std::string bar = SOME_MACRO;
void do_magic();
};
$ cat foo.cpp
#include "foo.hpp"
#include <iostream>
void Foo::do_magic() {
std::cout << bar << std::endl;
}
Компилируем её:g++ foo.cpp -shared -DSOME_MACRO=\"something\" -o libfoo.so -fpic
И три разных пользователя по-разному используют библиотеку:$ cat first.cpp
#include "foo.hpp"
int main() {
Foo foo;
foo.do_magic();
}
$ g++ first.cpp -o first -DSOME_MACRO=\"something\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./first
something
$ g++ first.cpp -o second -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./second
something wrong
$ cat third.cpp
#include "foo.hpp"
int main() {
Foo foo{"booom!"};
foo.do_magic();
}
$ g++ third.cpp -o third -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./third
booom!
АК
$ cat foo.hpp
// Our library header
#include <string>
struct Foo {
Foo() = default;
std::string bar = SOME_MACRO;
void do_magic();
};
$ cat foo.cpp
#include "foo.hpp"
#include <iostream>
void Foo::do_magic() {
std::cout << bar << std::endl;
}
Компилируем её:g++ foo.cpp -shared -DSOME_MACRO=\"something\" -o libfoo.so -fpic
И три разных пользователя по-разному используют библиотеку:$ cat first.cpp
#include "foo.hpp"
int main() {
Foo foo;
foo.do_magic();
}
$ g++ first.cpp -o first -DSOME_MACRO=\"something\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./first
something
$ g++ first.cpp -o second -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./second
something wrong
$ cat third.cpp
#include "foo.hpp"
int main() {
Foo foo{"booom!"};
foo.do_magic();
}
$ g++ third.cpp -o third -DSOME_MACRO=\"something\ wrong\" -L. -lfoo
$ LD_LIBRARY_PATH=. ./third
booom!
O
= default;
, а компилируем юзер-код с максимально разными вариациями предефайн макроса и наличием/отсутствием агрегатной инициализацииO
АК
= default;
, а компилируем юзер-код с максимально разными вариациями предефайн макроса и наличием/отсутствием агрегатной инициализацииO
foo.cpp
в шаред либу, все остальные исходники — в разные исполняемые файлыO
foo.cpp
в шаред либу, все остальные исходники — в разные исполняемые файлыАК
АК
O
АК
АК
O
АК
struct A { A() = default; };
или даже struct A {};
, ты автоматом получишь код:inline constexpr A() noexcept = default;
inline
и любое обращение к нему - вызов inline функции. Соответственно, твой макрос приводит к тому, что этот конструктор может иметь разное телоАК
inline int f() { return SOME_MACRO; }
O
struct A { A() = default; };
или даже struct A {};
, ты автоматом получишь код:inline constexpr A() noexcept = default;
inline
и любое обращение к нему - вызов inline функции. Соответственно, твой макрос приводит к тому, что этот конструктор может иметь разное телоАК
АК