Расширение C / C ++ для Visual Studio Code "переменная" u8 "" не является именем типа " - PullRequest
0 голосов
/ 27 мая 2020

Я использую VS Code для встроенных C проектов с расширением C / C ++ от Microsoft. У меня есть заданная схема именования типов, за которую я не отвечаю и не могу ничего изменить.

Чтобы использовать эти имена, у меня есть, например, следующие typedefs

typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short u16;
typedef volatile unsigned long vu32;

Когда используя тип u8 где угодно (даже в строке после typedef), не выделяется как имя типа, в то время как выделяется в самой строке typedef . Он получает , помеченный как ошибка с этим сообщением об ошибке:

"Variable "u8"" is not a type name.

Все остальные типы работают нормально.

Кажется, проблема не связана с длиной так как тип s8 работает. Я попытался изменить его на u7, и это сработало, поэтому в начале не должно быть «u», и я попытался добавить такую ​​букву: u8e, это тоже сработало.

I нашел это , и когда я пробую эти четыре вкладыша самостоятельно:

typedef unsigned char u8;
typedef unsigned short u16;
u8 testVar8;
u16 testVar16;

Я не получаю сообщение об ошибке, поэтому меня это еще больше смущает.

Во время записи с этим вопросом я вернулся в окно VS Code, просто чтобы заметить, что все красные подчеркивания исчезли вместе со всеми ошибками, но в следующий раз, когда я открываю VS Code, у меня была такая же проблема.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Ваш код все равно будет компилироваться. Просто из C11, u8, за которым следует строка в кавычках, означает, что следующая строка закодирована в UTF-8. Есть и другие: U и L особенно опасны, так как вы можете видеть, что они используются как верхние и нижние в коде оптимизации, особенно преобразованном из FORTRAN. Это, кстати, не критическое изменение языка.

Единственная реальная проблема здесь заключается в том, что подсветчик синтаксиса в MSV C использует набор инструментов, отличный от фактического компилятора и, хотя это впечатляющий набор, он не идеален.

Лично я бы изменил ваши typedefs на

typedef uint16_t u16;
typedef volatile unsigned long uint32_t vu32;

с целью полного их удаления (да, я знаю, что это не так вариант в настоящее время, но одна из ваших задач как программиста - влиять). В настоящее время последний typedef необходимо будет настроить для правильной работы с типичными наборами инструментов Unix.

1 голос
/ 27 мая 2020

В стандарте ISO C и в VS u8 - это один из строковых литералов , но вы получаете доступ к ним через заголовок, возможно locale.h включенный через string. Документ MS по ним: здесь .

Не рекомендуется использовать такие короткие идентификаторы, также вам было бы лучше определить типы через типы фиксированной длины

...