время не определено при использовании windows.h и WIN32_LEAN_AND_MEAN - PullRequest
1 голос
/ 15 декабря 2009

Чтобы избежать конфликтов с winsock2.h, я хочу обернуть мое включение windows.h в WIN32_LEAN_AND_MEAN (я отменяю его после windows.h, чтобы не мешать приложениям, которые включают мои заголовки). Это приводит к неопределенности timeval, когда winsock2.h не включен. Включение time.h также не определяет timeval.

Как я могу определить временной интервал (a) без необходимости включать winsock2.h, (b) не требовать, чтобы приложения, включающие мои заголовки, включали winsock2.h перед моими заголовками, (c) позволяя приложению включать winsock2.h они нуждаются в них, и (d) нет необходимости определять timeval самостоятельно, потому что он уже может быть определен заголовком, который включает родительское приложение?

Ответы [ 4 ]

1 голос
/ 02 мая 2011

Вот как я решаю проблемы с winsock2.h (при условии Visual C ++):

  • Я сконфигурировал систему сборки так, чтобы она всегда передавала /D_WINSOCKAPI_ компилятору в командной строке, чтобы заголовочные файлы winsock не включались неявным образом.
  • Когда я хочу включить winsock2.h, я делаю это через заголовочный файл прокси, который делает для меня магию препроцессора.

Вот как работает мой заголовочный файл:

#pragma push_macro("_WINSOCKAPI_")
#undef _WINSOCKAPI_
#include <winsock2.h> 
#pragma pop_macro("_WINSOCKAPI_")

Если вы сделаете это, вам не нужно будет #define WIN32_LEAN_AND_MEAN, и вы сможете использовать winsock2.h только при необходимости.

1 голос
/ 29 апреля 2011

Я не определяю ни один из LEAN_AND_MEAN, вместо этого я явно делаю следующее для каждого из «НЕТ» до включения windows.h

//  Exclude Input Method Manager (International stuff...one day)
#if !defined    NOIMM
    #define NOIME
    #define NOIMM
#endif

//  Exclude Metafile API
#if !defined    NOMETAFILE
    #define NOMETAFILE
#endif

Это позволяет мне использовать тот же StdAfx.h. С VS2010 я могу включить Winsock2 после windows.h без конфликтов.

Stdafx немного длиннее, но четко документирует, что включено и исключено.

1 голос
/ 02 мая 2011

Помните, что WIN32_LEAN_AND_MEAN - это оптимизация производительности компилятора. С его помощью ваши приложения будут несколько быстрее компилироваться за счет исключения некоторых менее используемых частей API Windows.

Вы можете использовать одно из более детальных отключений (NOIMM и т. Д.), Но они оказывают даже меньшее влияние на время компиляции, чем LEAN_AND_MEAN.

Если ваш проект не очень большой и не требует много времени на компиляцию, я бы просто прекратил использовать WIN32_LEAN_AND_MEAN.

Martyn

0 голосов
/ 16 декабря 2009

Я не думаю, что вы хотите, возможно. Структура timeval определена в winsock.h и winsock2.h, поэтому вы должны включить один из них, чтобы получить определение. Если вы не определите WIN32_LEAN_AND_MEAN, windows.h будет включать winsock.h; это делает невозможным включение winsock2.h. Если вы определите WIN32_LEAN_AND_MEAN, ни один из заголовочных файлов winsock не будет автоматически включен, поэтому вы не получите определение timeval. Я думаю, что ваш лучший вариант - требовать, чтобы приложения явно включали один из заголовков winsock.

...