Коды С++ ведут себя по-разному с разными флагами оптимизацииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Коды С++ ведут себя по-разному с разными флагами оптимизации

Сообщение Anonymous »

Было четыре файла: header.h, A.cpp, B.cpp, main.cpp.

Код: Выделить всё

// header.h
struct test {
static inline int get();
};

Код: Выделить всё

// a.cpp
#include "header.h"
int testA() { return test::get(); }
int test::get() { return 0; }

Код: Выделить всё

// b.cpp
#include "header.h"
int testB() { return test::get(); }
int test::get() { return 1; }

Код: Выделить всё

// main.cpp
#include 
int testA();
int testB();

int main() {
printf("%d %d\n", testA(), testB());
}
компилировать с помощью g++ -o main A.cpp B.cpp main.cpp -O0 двоичный код выводит два одинаковых числа, а -O3 всегда выводит 0 1 .
Кроме того, если я добавлю анонимное пространство имен в header.h, т.е.

Код: Выделить всё

// header.h
namespace {
struct test {
static inline int get();
}
}
Тогда -O0 также дает 0 1.
Но я не могу скомпилировать коды с анонимным пространством имен, если они изменятся test::get() в глобальную функцию

Код: Выделить всё

// header.h
namespace {
static inline int test_get();
}
// A.cpp
#include "header.h"
int testA() { return test_get(); }
//int test_get() { return 0; }
//namespace { int test_get() { return 0; }
// failed to compile neither with or without namespace
Может кто-нибудь объяснить здесь правила?


Подробнее здесь: https://stackoverflow.com/questions/780 ... ation-flag
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»