Я пытаюсь объявить свое собственное «CreateWindow» в своем пространстве имен «wnd», но gcc говорит «ошибка: макрос «CreateWindowA» требует 11 аргументов, но только 1 задан |». Подскажите, пожалуйста, как правильно получить. Вот код:

#include <windows.h>

namespace wnd
{


void CreateWindow()
{
}

}
3
graveman 13 Апр 2015 в 15:29
В windows.h есть функция CreateWindow().
 – 
NathanOliver
13 Апр 2015 в 15:34
3
Похоже, этот злой заголовок определяет имя как макрос. Единственное, что вы можете сделать, это выбрать другое имя или не включать этот заголовок. Я бы рекомендовал последнее, если вам по какой-то причине не нужна поддержка Windows.
 – 
Mike Seymour
13 Апр 2015 в 15:35
@NathanOliver: нет, это не так
 – 
Lightness Races in Orbit
13 Апр 2015 в 15:35
В смысле макрос?
 – 
Columbo
13 Апр 2015 в 15:36
1
@NathanOliver: Нет, это не функция (прокрутите страницу вниз! Следует признать, что остальная часть вводит в заблуждение). И в этом проблема.
 – 
Lightness Races in Orbit
13 Апр 2015 в 17:18

2 ответа

Имя CreateWindow уже существует в Windows API. К сожалению, ваше пространство имен (хорошая попытка!) не действует, поскольку исходный символ является макросом.

Для этого нет хорошего обходного пути, пока вы включаете windows.h. Вам придется выбрать другое имя для вашей функции.

4
Lightness Races in Orbit 13 Апр 2015 в 15:34

Есть макрос с именем CreateWindow, конфликтующий с именем вашей функции.

Лучше всего просто изменить название функции.

Если вы настаиваете, вы можете #undef CreateWindow, что проблематично, так как он отменит этот макрос для каждого файла, который будет включать ваш.

Итак, вам нужно сложить его и вернуть обратно:

#pragma push_macro("CreateWindow")
#undef CreateWindow

void CreateWindow()
{
}

#pragma pop_macro("CreateWindow")

* И он по-прежнему будет виден только в пределах области pragma.

1
Arnon Zilca 13 Апр 2015 в 15:35
1
Хорошо, хорошая идея. Но тогда вам придется делать это и на каждом месте вызова. Похоже на неправильный подход.
 – 
Lightness Races in Orbit
13 Апр 2015 в 15:34
Арнон Зилка, спасибо! Вроде с макросом этот фокус не проходит, только с функциями
 – 
graveman
13 Апр 2015 в 15:53