2015-01-06 2 views
2

Попытка скомпилировать проект с открытым исходным кодом с 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, и он был потерян в выводе компилятора в море нет. Спасибо всем! Какой квест.

+3

Кто-нибудь определил макрос? Если да, напишите их в орехах. – leppie

+1

есть. определенно «маленький» определен ранее. поставьте '#undef small' перед своим перечислением. –

+0

Запустите файл через препроцессор (с GCC, который будет параметром -E, не уверен, как с MSVC). Посмотрите, где появляется «маленький». –

ответ

5

small определено в rpcndr.h. Он используется как тип данных для MIDL.

+0

У нас есть победитель! Включение windows.h -> winscard.h -> wtypes.h -> rpcndr.h ->, который указывает '#define small char'. – malavv

Смежные вопросы