Почему включение windows .h создает синтаксические ошибки, предотвращая создание экземпляра класса? (C2146, C2065) - PullRequest
1 голос
/ 10 июля 2020

(Сведения о платформе: Windows 10, Visual Studio C ++ (MSV C 14.26.28801))

Вот базовая c репродукция. Рассмотрим следующую программу, которая отлично работает:

struct Rectangle {};

int main() {
    Rectangle rect {};
}

Компилируется и запускается, как ожидалось.

Но теперь, если мы введем импорт в windows .h следующим образом:

#include <Windows.h>

struct Rectangle {};

int main() {
    Rectangle rect {};
}

Получаем следующие ошибки компиляции:

  • syntax error: missing ';' before identifier 'rect' (C2146) [25, 5]
  • 'rect': undeclared identifier (C2065) [25, 5]
  • expected a ';' [25, 15]
  • 'rect': undeclared identifier (C2065) [26, 5]
  • identifier "rect" is undefined [26, 32]
  • function call missing argument list (C4551) [25, 5]

Ура!

Документы Microsoft не дают много информации: https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2146?view=vs-2019

(Я все еще новичок в C ++, извиняюсь, если это что-то очевидное)

Я предполагаю, что где-то в windows .h есть какая-то директива ... это меняет какое-то поведение, но я не совсем уверен, что искать или искать.

Спасибо!

1 Ответ

2 голосов
/ 10 июля 2020

Дерп, хорошо, нашел ответ.

Я использовал Rectangle в качестве примера «привет, мир».

Оказывается, windows .h уже включает «Прямоугольник», означает, что символы сталкиваются

(https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-rectangle)

Неявное выражение «все из windows .h теперь доступно в глобальном пространстве имен!» застали меня врасплох.

(Изменение имени моего класса на «Marks_Rectangle» решает проблему!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...