Ошибка макроса в 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, несмотря на то, что он не заботится о вашем коде, исправление достаточно простое... Просто не используйте составные литералы.

Другие вопросы по тегам