#ifdef для 32-разрядной платформы

Если вы заранее знаете желаемую высоту ваших гибких детей, использование свойства max-height является самым чистым решением, изначально предоставленным Flexbox, как и предложил @Lewis.

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

.parent {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(4, 100px);
}

.parent > * {
  border: 2px solid black; // added for clarity
  grid-row-start: 1;
  grid-row-end: 4;
}

.child2 {
  overflow-y: scroll;
}
21
задан veefu 9 April 2009 в 21:04
поделиться

9 ответов

I'm not sure if there is a universal #if def that is appropriate. The C++ standard almost certainly does not define one. There are certainly platform spcefic ones though.

For example, Windows

#if _WIN64 
// 64 bit build
#else
// 32 bit build
#endif

EDIT OP mentioned this is a cross compile between Windows and Non-Windows using GCC and other compilers

There is no universal macro that can be used for all platforms and compilers. A little bit of preprocessor magic though can do the trick. Assuming you're only working on x86 and amd64 chips the following should do the trick. It can easily be expanded for other platforms though

#if _WIN64 || __amd64__
#define PORTABLE_64_BIT
#else
#define PORTABLE_32_BIT
#endif
16
ответ дан 29 November 2019 в 19:59
поделиться

Я рекомендую добавить закладку в SourceForge . Единого ответа нет, но он, безусловно, может помочь вам начать работу.

РЕДАКТИРОВАТЬ: Для кода только GCC вы можете использовать __i386 __ для проверки 32-битных чипов x86, и я предлагаю попробовать __ X86_64 __ или что-то подобное для проверки 64-битных чипов x86. (Примечание: до меня дошло, что предыдущий ответ, включающий __ia86 __ , на самом деле представляет собой другой чип, а не 64-битный чип x86. Это просто показывает мой недостаток аппаратного опыта. Для тех, кто более разбирается в оборудовании чем я, использую страницу SourceForge на предопределенных макросах, на которые я ссылаюсь выше. Это гораздо точнее, чем я.) Есть некоторые другие, которые будут работать, но эти два должны быть довольно универсальными среди версий GCC.

15
ответ дан 29 November 2019 в 19:59
поделиться

You could check a well known type for it's size e.g. sizeof(int*) == 4 for a 32 bit platform.

As sizeof is known at compiletime I believe a

if(sizeof(int*) == 4)
{
  ...
}

should do the trick

Edit: the comments are right, you need to use a regular if, #if won't work.

If you are using C++ You could create templated code and let the compiler choose the specialization for you based on the sizeof() call. Если вы строите для 32-битной платформы, компилятор будет создавать только код для 32-битной платформы. Если вы строите для 654-битной платформы, компилятор будет создавать только код для 64-битной платформы.

5
ответ дан 29 November 2019 в 19:59
поделиться

То, что я, вероятно, в конечном итоге буду делать, находится внутри Makefile, определите, используете ли вы 32-битную платформу или 64 немного используя uname. Затем добавьте к своим CFLAGS, -DX32 или -DX64. Чтобы вы могли просто #ifdef X64.

Но это всего лишь неуместное решение. Я не уверен, что я буду делать на окнах.

2
ответ дан 29 November 2019 в 19:59
поделиться

Зависит от вашей ОС и компилятора, это решения по реализации.

1
ответ дан 29 November 2019 в 19:59
поделиться

Я считаю, что определение _WIN64

0
ответ дан 29 November 2019 в 19:59
поделиться

Нет такого символа, определенного стандартом C ++ - вашей конкретной платформы (которую вы не указали в своем вопросе ) может предоставить один.

0
ответ дан 29 November 2019 в 19:59
поделиться

Посмотрите на это:

макросы i386
макросы AMD64

6
ответ дан 29 November 2019 в 19:59
поделиться

Как минимум 32-битный Solaris имеет ограничение в 256 файловых указателей, потому что структура хранит файловый дескриптор в неподписанном символе поле. Это сохраняется для обратной совместимости с некоторыми почти невозможными старыми версиями SunOS. Другие платформы - я склонен сказать, что большинство других платформ - не разделяют это ограничение. С другой стороны, для обычной пользовательской программы относительно редко требуется, чтобы много файлов открывались одновременно; это чаще указывает на ошибку (не закрывая файлы, когда закончил с ними), чем нет. Сказав это, тем не менее, это может быть проблемой для таких вещей, как серверы баз данных, которые должны иметь много открытых файлов данных одновременно.


Один комментарий гласит:

Это почти все. У нас нет большого количества открытых файлов, но сервер обрабатывает большое количество подключений от клиентов. Дескрипторы сокетов и файловые дескрипторы, кажется, происходят из одного места. Когда у нас много соединений, «fopen» завершается неудачно, потому что возвращается системный вызов и fd> 255.

«Дескрипторы сокетов» являются файловыми дескрипторами на уровне системных вызовов, поэтому они приходят из того же места, что и обычный файл. дескрипторы для файлов.

Если вам нужно обойти это, вам нужно обернуть текущий код открытия сокета, чтобы, если он получает дескриптор файла в диапазоне 0..255, он вызывал ' dup2 () 'создать дескриптор файла в диапазоне, который stdio не будет использовать, а затем закрыть исходный дескриптор файла. Единственная загвоздка в том, что вы должны отслеживать, какие файловые дескрипторы доступны, потому что dup2 будет весело закрывать дескриптор целевого файла, если он в данный момент открыт.

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

2
ответ дан 29 November 2019 в 19:59
поделиться