Stati c структура и одно правило определения - PullRequest
0 голосов
/ 23 февраля 2020

1. cpp:

static struct SA {
    int m=1;
    int func() {return m;}
}g;

static void test() {
    g.func();
}

2. cpp:

static struct SA {
    int m=2;
    int func() {return m*m;}
}g;

static void test() {
    g.func();
}

(1) В таком случае нарушается одно правило определения? (2) Если нет, то ODR нарушается только тогда, когда где-то есть ссылка на SA?

1 Ответ

1 голос
/ 23 февраля 2020

Да, правило нарушено. Скажем, если оба. cpp встроены в одну и ту же библиотеку stati c и используется одна из них, это приведет к UB. Это связано с тем, что компоновщик не может определить разницу между этими двумя ссылками и случайным образом. То же самое происходит, когда вы связываете несколько библиотек stati c, которые определяют один и тот же символ. Линкер просто предполагает, что это одно и то же.

Фактически, часто компоновщику приходится выбрасывать дубликаты из-за определений функций / классов в заголовках.

IIR C разделяемые библиотеки / .dll более устойчивость к этой проблеме, так как компоновщику доступно только гораздо более ограниченное количество символов.

В C ++ 20 модули должны устранять такие проблемы.

...