Предупреждение C4099: имя типа, впервые увиденное с использованием 'class', теперь видимое с использованием 'struct' (MS VS 2k8)

Это хорошо:

https://github.com/mafintosh/json-markup из mafintosh

const jsonMarkup = require('json-markup')
const html = jsonMarkup({hello:'world'})
document.querySelector('#myElem').innerHTML = html

HTML


15
задан Adam Naylor 22 January 2009 в 09:06
поделиться

6 ответов

Это предупреждение появляется, когда у Вас есть одно описание типа, которое противоречит другому (каждый говорит, что "класс", другой говорит "структуру"). Учитывая одно правило определения, все объявления за исключением самое большее нужно быть предописаниями. Предупреждение будет обычно указывать, что предописание типа является неправильным и обычно является простой опечаткой и должно быть исправлено. В этом случае не должно быть никаких побочных эффектов, но действительно необходимо зафиксировать его.

Может быть, однако, некоторые очень противные вещи происходят, если у Вас есть столкновения имени типа (возможно, вызванный при помощи "использования пространства имен" пункты или загрязнение глобального пространства имен). Эти предупреждения могли указывать на смешивание заголовков из двух различных библиотек, и имена типов имеют столкновения. Код, скомпилированный при этих условиях, мог сделать некоторые очень неожиданные вещи.

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

25
ответ дан 1 December 2019 в 01:17
поделиться

Только принести комментарий MSalters против этого сообщения выше к верхнему уровню. У меня были несколько твердые найти ошибки компоновщика в результате VC с помощью 'класса' или ключевого слова 'структуры' в его искажении имен.

Если Вы не ожидаете, что это будет проблемой, Вас можно оставить, царапая Вашу голову в течение многих часов!

5
ответ дан 1 December 2019 в 01:17
поделиться

Хотя это считают плохой практикой, я думаю, что не должно быть никакой проблемы, смешивающей определение класса и объявление структуры, поскольку они - в основном совпадающий тип данных. Основное различие - то, что участники структуры общественностью по умолчанию вопреки участникам класса, которые являются частными, но иначе расположение памяти идентично.

1
ответ дан 1 December 2019 в 01:17
поделиться

В C++ единственная разница между классом и структурой - то, что членские переменные класса, функции членства и базовые классы являются частными по умолчанию, в то время как в структуре они общественностью по умолчанию; таким образом то, что классом является POD, не должно иметь никакого значения здесь.
Я предположил бы, что это предупреждение прибывает из обслуживания кода (определение, обновленное куда-нибудь, но не где-то в другом месте), и исправьте код так, чтобы предупреждение исчезло (например, класс использования в определении типа).

0
ответ дан 1 December 2019 в 01:17
поделиться

Richard Corden is correct - there is a reason MS has this warning. For the MS compiler, decorated (mangled) names include which class-key (struct or class) is used to declare a type. If a function that takes some object as an argument or returns that object is referenced somewhere when the wrong class-key is visible, you will not get a compiler error but the linker will complain because the decorated names differ. The linker error only shows the symbol it's looking for, and it's easy to overlook the class-key mismatch there, so the earlier, more detailed compiler warning is valuable. It's still possible that the two versions don't appear in the same compilation unit, of course, and you will probably be scratching your head for a while if you believe that the only difference is default member visibility.

The difference in mangling conflicts with the C++ standard, which says that forward declarations like struct Foo; and class Foo; are equivalent, and so should use the same mangling.

2
ответ дан 1 December 2019 в 01:17
поделиться

Я подробно обсуждаю это предупреждение в своем блоге « Действительно ли C4099 - глупое предупреждение?» . Мой вывод - лучше выключить. :-) Ну по крайней мере для меня.

3
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: