C语言的yaml库有 libyaml 和 libcyaml (The Official YAML Web Site)
个人觉得libcyaml比较好用,libcyaml项目地址:GitHub - tlsa/libcyaml: C library for reading and writing YAML.
libcyaml编译没有难度,按照说明编译即可,需要注意的是提前安装libyaml-dev:
sudo apt install libyaml-dev下面直接上例子:
~/test
-include
-cyaml
cyaml.h
-lib
libcyaml.a
1.yaml
main.c
Makefile
1.yaml
# slave 1
Name: "drive_1"
Pos: 1
Vendor_ID: 0x00000A1E
Product_ID: 0x00000305
Sdo:
- Description: "To disable [AL. 090.1], set [Pr. PC41.0 [AL. 090.1 Homing incomplete] detection selection] to '1' (disabled)."
Index: 0x2129
SubIndex: 0x00
BitLen: 32
Value: 1
- Description: "Pr. PD01.2_Input signal automatic ON selection"
Index: 0x2181
SubIndex: 0x00
BitLen: 32
Value: 0x00000C00
- Description: "Reset alarm. Writing '1EA5h' resets an alarm."
Index: 0x2A46
SubIndex: 0x00
BitLen: 16
Value: 0x1EA5
main.c
#includeMakefile#include #include struct sdo { char *description; int *index; int *subindex; int *bitlen; int *value; }; struct slave { char *name; int *pos; int *vendor_id; int *product_id; struct sdo *sdos; unsigned sdos_count; }; static const cyaml_schema_field_t sdo_fields_schema[] = { CYAML_FIELD_STRING_PTR( "Description", CYAML_FLAG_POINTER, struct sdo, description, 0, CYAML_UNLIMITED), CYAML_FIELD_UINT("Index", CYAML_FLAG_DEFAULT, struct sdo, index), CYAML_FIELD_UINT("SubIndex", CYAML_FLAG_DEFAULT, struct sdo, subindex), CYAML_FIELD_UINT("BitLen", CYAML_FLAG_DEFAULT, struct sdo, bitlen), CYAML_FIELD_UINT("Value", CYAML_FLAG_DEFAULT, struct sdo, value), CYAML_FIELD_END }; static const cyaml_schema_value_t sdo_schema = { CYAML_VALUE_MAPPING(CYAML_FLAG_DEFAULT, struct sdo, sdo_fields_schema), }; static const cyaml_schema_field_t slave_fields_schema[] = { CYAML_FIELD_STRING_PTR( "Name", CYAML_FLAG_POINTER, struct slave, name, 0, CYAML_UNLIMITED), CYAML_FIELD_UINT( "Pos", CYAML_FLAG_DEFAULT, struct slave, pos), CYAML_FIELD_UINT( "Vendor_ID", CYAML_FLAG_DEFAULT, struct slave, vendor_id), CYAML_FIELD_UINT( "Product_ID", CYAML_FLAG_DEFAULT, struct slave, product_id), CYAML_FIELD_SEQUENCE( "Sdo", CYAML_FLAG_POINTER, struct slave, sdos, &sdo_schema, 0, CYAML_UNLIMITED), CYAML_FIELD_END }; static const cyaml_schema_value_t slave_schema = { CYAML_VALUE_MAPPING(CYAML_FLAG_POINTER, struct slave, slave_fields_schema), }; static const cyaml_config_t config = { .log_fn = cyaml_log, .mem_fn = cyaml_mem, .log_level = CYAML_LOG_WARNING, }; int main(int argc, char *argv[]) { cyaml_err_t err; struct slave *slave; enum { ARG_PROG_NAME, ARG_PATH_IN, ARG_PATH_OUT, ARG__COUNT, }; // // if (argc != ARG__COUNT) { // fprintf(stderr, "Usage:n"); // fprintf(stderr, " %s
INCLUDE = -I include CFLAGS += $(INCLUDE) CFLAGS += -std=c11 -Wall -Wextra -pedantic -Wconversion -Wwrite-strings -Wcast-align -Wpointer-arith -Winit-self -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wundef -Wvla -Wdeclaration-after-statement LDFLAGS += -lyaml -Llib -lcyaml all: main main: main.c $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS)



