Что делает синтаксис структуры C++ “a: b” средний

tl; dr Поскольку ваш вопрос показывает использование cross-var, я предположил, что требуется кроссплатформенное решение. В этом случае см. Решение A . Однако, если моё предположение неверно, обратитесь либо к решению B , либо к C .


Решение A: Кроссплатформенное (Windows / Linux / macOS ...)

Для кроссплатформенного решения (то есть того, которое успешно работает в Windows, Linux и macOS ...) вам нужно будет использовать nodejs для достижения ваших требований. Есть несколько различных подходов к этому, как описано в следующих двух подразделах:

  • Использование внешнего файла nodejs (.js)
  • Включение вашего JavaScript в пакет .json. [+1162]

Примечание оба подхода фактически одинаковы

Использование внешнего файла nodejs (.js)

  1. [ 1177] Создайте служебный скрипт nodejs. Давайте назовем файл run-ng-build.js и сохраним его в корневом каталоге вашего проекта, то есть в том же каталоге, где в настоящее время находится package.json :

    [ 1178] run-ng-build.js

    const uuid = require('uuid/v1');
    const execSync = require('child_process').execSync;
    
    process.env.UUID = uuid();
    
    execSync('ng build', { stdio: [0, 1, 2]} );
    
  2. В разделе scripts вашего package.json замените ваш текущий build скрипт следующим:

    package.json

    "scripts": {
      "build": "node run-ng-build"
    }
    

Объяснение:

  • В run-ng-build.js нам требуется пакет uuid и встроенный nodejs ] execSync() . ​​
  • Для создания переменной среды с именем UUID мы используем встроенную в nodejs process.env и присваиваем ей значение uuid , вызывая uuid().
  • Затем мы вызываем команду ng build, используя execSync.
  • Опция options.stdio настраивает каналы между родительским и дочерним процессами - [0, 1, 2] эффективно наследует stdin, stdout и stderr.

Включение вашего JavaScript в package.json .

В качестве альтернативы вы можете встроить свой код nodejs / JavaScript в раздел scripts вашего package.json .

  1. В разделе scripts вашего package.json замените ваш текущий скрипт build следующим:

    package.json

    "scripts": {
      "build": "node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng build', { stdio: [0, 1, 2]} );\""
    }
    

Объяснение:

  • Это фактически то же самое, что и вышеупомянутое решение это использовало отдельный файл .js, однако использование отдельного сценария / файла nodejs теперь излишне.
  • Параметр командной строки nodejs -e используется для оценки встроенного JavaScript.

Важно Пакет cross-env является избыточным с использованием любого из двух вышеупомянутых решений. Чтобы удалить его, запустите: npm un -D cross-env через CLI.


Решение B: * Только для платформ Nix (Linux / MacOS ...)

Только для платформ * nix это становится очень кратким, вы можете просто определить свой скрипт build в package.json выглядит следующим образом:

package.json

"scripts": {
  "build": "cross-env UUID=$(uuid) ng build"
}

Это использует функцию Bash, известную как команда замещение , т.е. $(uuid). Однако, если * nix - единственная платформа, которую вам нужно поддерживать, тогда cross-env действительно не требуется. Вместо этого используйте встроенную функцию экспорта . Например:

package.json

"scripts": {
  "build": "export UUID=$(uuid) && ng build"
}

Решение C: Только Windows (cmd.exe)

[ 1191] В Windows (только), запущенной через командную строку или PowerShell, вы можете сделать следующее:

package.json

"scripts": {
  "build": "FOR /F %U IN ('uuid') DO cross-env UUID=%~U node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng buuld', { stdio: [0, 1, 2] });\""
}

This аналогичен первому примеру, показанному в Решение B , однако подстановка команд выполняется (очень) по-другому в cmd.exe . См. Этот ответ для дальнейшего объяснения.

28
задан 3 revs, 3 users 91% 2 September 2014 в 14:51
поделиться

4 ответа

Битовые поля, перенесенные из C. Имя имеет ширину 40 бит, Цвет имеет ширину 24 бита. Следовательно, ваша структура имеет как минимум 64 бита. В моей системе 64 бита были бы 8 байтами.

21
ответ дан 28 November 2019 в 03:26
поделиться

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

9
ответ дан 28 November 2019 в 03:26
поделиться

Это определение битового поля.

Имя - это целое число, которое может хранить ровно 40 бит информации. Цвет может хранить 24 бита.

Это часто делается для того, чтобы сэкономить место в часто используемых структурах или сжать код до размера, который легко обрабатывать для ЦП (в вашем случае 64 бита. Вписывается точно в регистр ЦП на 64-битной машине).

Код, который обращается к битовым полям, будет выполняться чуть медленнее.

6
ответ дан 28 November 2019 в 03:26
поделиться

Используйте их разумно :

Помните, что почти все о битовые поля - это реализация зависимый. Например, биты ли хранятся слева направо или справа налево зависит от фактического аппаратная архитектура. Более того, каждый компилятор использует свой член модель выравнивания, поэтому размер оптимизированного BillingRec составляет 12 байтов, а не 9. Вы не можете взять адрес битового поля, вы не можете создать массивы битов. Наконец, на большинстве реализации использования битовых полей несёт скорость над головой. Поэтому, когда Вы оптимизируете свой код, измеряете эффект определенной оптимизации и его компромиссы, прежде чем вы решите использовать it.

3
ответ дан 28 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

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