Попытка скомпилировать проект с открытым исходным кодом с VS2010, VS2012 в x86 и x86_64 на платформе Windows с QT5.4.Почему «маленький» дает ошибку о «char»?
Файл с именем unit.h содержит часть:
[...]
// DO NOT change noscale's value. Lots of assumptions are made based on this
// value, both in the code and (more importantly) in the database.
enum unitScale
{
noScale = -1,
extrasmall = 0,
small = 1, // Line that causes errors.
medium = 2,
large = 3,
extralarge = 4,
huge = 5,
without = 1000
};
[...]
Генерирует
- ошибки C2062: тип 'символ' неожиданного
- ошибка C3805: 'типа': неожиданный маркер , ожидаемый либо '}' или a ','
I попробовал каждый трюк в моей шляпе, чтобы решить эту проблему. Я удалил каждое использование «маленького» перечисления в коде, и я все еще получаю ошибку. Но после удаления всех видов использования я переименовал «маленький» в «малый», все в порядке. Кажется, это указывает на столкновение имен, но поиск файлов не дает мне никаких ссылок во всем проекте. Это не ключевое слово, о котором я знаю.
Есть идеи?
EDIT: Благодаря очень полезным комментариям здесь представлена еще более странная версия , которая работает. Может ли кто-нибудь объяснить?
#ifdef small // Same with just straight "#if"
#pragma message("yes")
#endif
#ifndef small
#pragma message("no") // Always prints no.
#endif
#undef small
enum unitScale
{
noScale = -1,
extrasmall = 0,
small = 1,
medium = 2,
large = 3,
extralarge = 4,
huge = 5,
without = 1000
};
EDIT 2: Директива Прагма показывал да, но только в файлах, которые были ранее загружены заголовок windows.h, и он был потерян в выводе компилятора в море нет. Спасибо всем! Какой квест.
Кто-нибудь определил макрос? Если да, напишите их в орехах. – leppie
есть. определенно «маленький» определен ранее. поставьте '#undef small' перед своим перечислением. –
Запустите файл через препроцессор (с GCC, который будет параметром -E, не уверен, как с MSVC). Посмотрите, где появляется «маленький». –