Заголовочные файлы переопределения C++ (winsock2.h)

Используя 7zip для извлечения файла ISO чрезвычайно просто, даже он имеет несколько частей. Давайте предположим, что Вы сделали, чтобы ISO заархивировала с тремя частями, названными iso.001 , iso.002 , iso.003 .

стандартная командная строка таким образом:

7z x a.iso.001 -tiso.split -o output_dir

или

7z x a.iso.001 -tudf.split -o output_dir

Передача флаг-t с "разделил" , признак конкретно скажет 7z, что ISO имеет мультичасти, предшествование , "iso" or "udf" будет зависеть от Вашего формата контейнера ISO.

133
задан Leif Gruenwoldt 5 February 2015 в 16:32
поделиться

9 ответов

#include guards - стандартный способ сделать это. #pragma once - нет, что означает, что не все компиляторы его поддерживают.

1
ответ дан 24 November 2019 в 00:00
поделиться

Эта проблема возникает, если перед . Попробуйте организовать свой список включения так, чтобы был включен после или сначала определите _WINSOCKAPI_ :

#define _WINSOCKAPI_    // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h"    // Which includes <winsock2.h>

См. Также это .

219
ответ дан 24 November 2019 в 00:00
поделиться

#pragma once основан на полном пути имени файла. Так что, скорее всего, у вас есть две идентичные копии MyClass.h или Winsock2.h в разных каталогах.

2
ответ дан 24 November 2019 в 00:00
поделиться

Вы должны использовать защиту заголовка.

поместите эту строку вверху файла заголовка

#ifndef PATH_FILENAME_H
#define PATH_FILENAME_H

и внизу

#endif
2
ответ дан 24 November 2019 в 00:00
поделиться

Я бы не стал использовать только FILENAME_H но

#ifndef FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD
#define FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD

//code stuff
#endif // FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD

я всегда использовал postfix guid. Несколько лет назад я столкнулся с очень плохой базой кода, в которой были разные файлы заголовков с одним и тем же именем и включали защиту. В рассматриваемых файлах был определен класс с таким же именем. Если бы использовались только пространства имен. Некоторые проекты собраны, некоторые нет. Использование уникальных средств защиты было частью решения по различению заголовков и их содержимого.

В Windows с Visual Studio используйте guidgen.exe, в Linux - uuidgen -t.

4
ответ дан 24 November 2019 в 00:00
поделиться

#pragma once работает нестабильно даже в компиляторах MS и не поддерживается многими другими компиляторами. Как уже упоминали многие другие люди, использование include guards - лучший способ. Ни в коем случае не используйте #pragma once - это значительно облегчит вам жизнь.

1
ответ дан 24 November 2019 в 00:00
поделиться

Используя «защиту заголовков»:

#ifndef MYCLASS_H
#define MYCLASS_H

// This is unnecessary, see comments.
//#pragma once

// MyClass.h

#include <winsock2.h>

class MyClass
{

// methods
public:
    MyClass(unsigned short port);
    virtual ~MyClass(void);
};

#endif
14
ответ дан 24 November 2019 в 00:00
поделиться

Я столкнулся с этой проблемой, когда пытался вытащить сторонний пакет, который явно включал windows.h где-то в беспорядке заголовков. Определить _WINSOCKAPI_ на уровне проекта было намного проще (не говоря уже о более удобном обслуживании), чем пробираться через их суп и исправлять проблемные включения.

6
ответ дан 24 November 2019 в 00:00
поделиться

О - уродство Windows... Здесь важен порядок включения. Вам нужно включить winsock2.h перед windows.h. Поскольку windows.h, вероятно, включен из вашего предварительно скомпилированного заголовка (stdafx.h), вам нужно включить winsock2.h оттуда:

#include <winsock2.h>
#include <windows.h>
15
ответ дан 24 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: