Необходимо различать значения, существующие во время выполнения, и значения, которые существуют только во время компиляции.
Любое значение, скомпилированное в раздел данных программы, существует по адресу во время выполнения и для многобайтовогоПередача значений по ссылке является нормой (и единственный практический выбор для 64-битных значений).Это также означает, что значения, которые существуют только во время компиляции, не могут быть адресованы напрямую, это в основном макросы (например, перечисления).Перечисления, как правило, используются статически во время выполнения, что означает, что они могут никогда не покинуть программный раздел и стать адресуемыми.
Однако вы можете повторно использовать переменные для своих констант, вот два примера, использующих raw posix / linuxwrite:
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
enum {
FIRST = 10000,
SECOND,
THIRD
};
//This can (and probably will automatically) be inlined
void write_constant(uint16_t val, int fd)
{
write(fd, &val, sizeof(val));
}
int main (void)
{
int fd;
uint16_t out;
fd = open("/tmp/testfile", O_CREAT | O_WRONLY, 0640);
//First example, reusing variable and assigning compile time constants:
out = FIRST; write(fd, &out, sizeof(out));
out = SECOND; write(fd, &out, sizeof(out));
out = THIRD; write(fd, &out, sizeof(out));
//Second example, wrapping the write in a function
//This wraps the value inside an uint16_t value on either stack or register:
write_constant(FIRST,fd);
write_constant(SECOND,fd);
write_constant(THIRD,fd);
close(fd);
return 0;
}
При записи нескольких целых чисел напрямую без средства форматирования следует отметить одну вещь: порядковый номер программы сохраняется в файле и в большинстве случаев он не читается человеком.