Ошибка макроса в C99 и MS Visual Studio 2015
У нас есть проблемы при компиляции нашего кода GCC C99 с MSVS 2015. Проблемной строкой является расширение макроса, проблема возникает в этой строке:
const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
Ошибка примерно такая
IntelliSense значение типа UA_String не может использоваться для инициализации объекта типа UA_Int32.
где макросы следующие:
#define UA_QUALIFIEDNAME(NS_INDEX, CHARS) (const UA_QualifiedName) { \
.namespaceIndex = NS_INDEX, .name = UA_STRING(CHARS) }
#define UA_STRING(CHARS) (UA_String) {strlen(CHARS), (UA_Byte*)CHARS }
и структуры
typedef struct {
UA_Int32 length;
UA_Byte *data;
} UA_String;
так же как
typedef struct {
UA_UInt16 namespaceIndex;
UA_String name;
} UA_QualifiedName;
Это действительный код C, насколько я вижу. У кого-нибудь есть идеи, как мы можем обойти это для MSVS?
PS: по-видимому, это бросок к UA_String
во втором макросе. Однако удаление его нарушает код для gcc и clang
1 ответ
C99 представил поддержку функции, известной как составные литералы, которая проявляется как приведение к UA_String
во втором макросе. Это на самом деле не актерский состав. Это инициализация и использование анонимного объекта. Вы правы, хотя... Это был действительный C, по крайней мере пятнадцать лет.
К сожалению, как вы уже поняли, MSVS не полностью поддерживает C99. Правильно, есть совершенно правильный, переносимый и совместимый код C, который был написан пятнадцать лет назад и не будет компилироваться с использованием MSVS.
Microsoft заявляет о поддержке в документации (поскольку они представили некоторые функции C99ish). Однако они не представили никаких основных языковых дополнений, таких как составные литералы. Фактически, даже части библиотеки сломаны фундаментальными способами; printf
а также scanf
нужны серьезные обновления. MSVS ненавидит C программистов:(
Возможно, вы добьетесь некоторого успеха при компиляции кода C99 в MSVS, начав работу с системой LLVM с использованием Microsoft Visual Studio...
В качестве альтернативы, если вам необходимо использовать компилятор Microsoft, несмотря на то, что он не заботится о вашем коде, исправление достаточно простое... Просто не используйте составные литералы.