Подтвердить что ты не робот

VS 2015 компиляция cocos2d-x 3.3 ошибка "фатальная ошибка C1189: #error: определение макросов snprintf макроса с объявлением функции стандартной библиотеки"

Когда я компилирую cocos2d-x (версия 3.3) с помощью visual studio 2015, произошла ошибка, говоря:

Неустранимая ошибка C1189: #error: определение макроса snprintf макроса с объявлением функции стандартной библиотеки (编译 源 文件..\base\s3tc.cpp)

Исходный код:

#ifdef snprintf
    #error Macro definition of snprintf conflicts with Standard Library 
             function declaration
#endif

Кто-нибудь может сказать мне, что случилось?

4b9b3361

Ответ 1

До сих пор многие библиотеки и программы использовали функцию snprintf(), определяя ее как _snprintf(), поскольку поддерживается _snprintf().

#define snprintf _snprintf

Наконец, Visual Studio 14 определяет snprintf()!

Так как snprintf() теперь официально поддерживается. Мы не должны #define его.

Выполнение этой функции затмит новую функцию snprintf(), определенную в stdio.h.

Чтобы ограничить это, это добавлено в stdio.h

#ifdef snprintf
    #error: Macro definition of snprintf conflicts with Standard Library function declaration"
#endif

Следовательно, ваш код не компилируется.

Верно, что во всех предыдущих версиях Visual Studio вы должны использовать функцию _snprintf(). Но VS 2014 вперед вы не должны # определять его с помощью _snprintf().

Где-то в вашем коде или, скорее всего, в заголовках cocos это делается и, следовательно, ошибка.

Проверьте это и удалите этот #define.

snprintf() является частью спецификаций C99.

Чтобы включить поддержку C99

добавьте это в свою программу

#if _MSC_VER>=1900
#  define STDC99
#endif

Если вы не знаете, какие макросы _MSC_VER

...
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)
MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)
MSVC++ 7.1  _MSC_VER == 1310 (Visual Studio .NET 2003)
MSVC++ 7.0  _MSC_VER == 1300
MSVC++ 6.0  _MSC_VER == 1200
MSVC++ 5.0  _MSC_VER == 1100
MSVC++ 4.0  _MSC_VER == 1000
MSVC++ 2.0  _MSC_VER ==  900
MSVC++ 1.0  _MSC_VER ==  800
C/C++  7.0  _MSC_VER ==  700
C      6.0  _MSC_VER ==  600

Ответ 2

user1 прав.

Но даже если вы устраните проблему таким образом, вы, вероятно, столкнетесь с проблемами с компоновщиками с заранее созданными библиотеками.

Чтобы избежать этого, нужно изменить набор инструментов платформы для всех проектов на Visual Studio 2013 (v120)

И на странице компоновщика/ввода propry добавьте libcmt.lib для игнорирования конкретных библиотек по умолчанию: libcmt.lib; libcmtd.lib;...

Ответ 3

Просто найдите определение snprintf в своем коде и не определяйте его во время VS2015.
Что-то вроде:

#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s 
#endif