gpt4 book ai didi

用于将枚举元素名称和值保存到文件的 C++ 宏

转载 作者:行者123 更新时间:2023-11-28 07:25:35 26 4
gpt4 key购买 nike

通常我尽量避免使用宏,所以除了最基本的宏之外,我实际上不知道如何使用它们,但我正在尝试进行一些元操作,所以我认为需要宏。

我有一个枚举,列出了各种日志条目及其各自的 ID,例如

enum LogID
{
LOG_ID_ITEM1=0,
LOG_ID_ITEM2,
LOG_ID_ITEM3=10,
...
}

在将数据写入日志文件时在我的程序中使用。请注意,它们通常不会以任何顺序排列。

我的大部分日志文件后处理都是在 Matlab 中进行的,所以我想将相同的变量名和值写入一个文件,以便 Matlab 加载。例如,一个看起来像这样的文件

LOG_ID_ITEM1=0;
LOG_ID_ITEM2=1;
LOG_ID_ITEM3=10;
...

我不知道该怎么做,但看起来应该不会太复杂。如果有帮助,我正在使用 c++11。

编辑:为澄清起见,我不是在寻找宏本身来编写文件。我想要一种以某种方式将枚举元素名称和值存储为字符串和整数的方法,这样我就可以使用常规的 c++ 函数将所有内容写入文件。我在想这个宏可能会被用来将字符串和值构建成 vector ?那样有用吗?如果是,怎么办?

最佳答案

我同意 Adam Burry 的观点,一个单独的脚本可能最适合这个。不确定您熟悉哪些语言,但这里有一个快速的 Python 脚本可以完成这项工作:

#!/usr/bin/python

'''Makes a .m file from an enum in a C++ source file.'''


from __future__ import print_function
import sys
import re


def parse_cmd_line():

'''Gets a filename from the first command line argument.'''

if len(sys.argv) != 2:
sys.stderr.write('Usage: enummaker [cppfilename]\n')
sys.exit(1)
return sys.argv[1]


def make_m_file(cpp_file, m_file):

'''Makes an .m file from enumerations in a .cpp file.'''

in_enum = False
enum_val = 0
lines = cpp_file.readlines()

for line in lines:
if in_enum:

# Currently processing an enumeration

if '}' in line:

# Encountered a closing brace, so stop
# processing and reset value counter

in_enum = False
enum_val = 0
else:

# No closing brace, so process line

if '=' in line:

# If a value is supplied, use it

ev_string = re.match(r'[^=]*=(\d+)', line)
enum_val = int(ev_string.group(1))

# Write output line to file

e_out = re.match(r'[^=\n,]+', line)
m_file.write(e_out.group(0).strip() + '=' +
str(enum_val) + ';\n')
enum_val += 1
else:

# Not currently processing an enum,
# so check for an enum definition

enumstart = re.match(r'enum \w+ {', line)
if enumstart:
in_enum = True


def main():

'''Main function.'''

# Get file names

cpp_name = parse_cmd_line()
m_name = cpp_name.replace('cpp', 'm')
print('Converting ' + cpp_name + ' to ' + m_name + '...')

# Open the files

try:
cpp_file = open(cpp_name, 'r')
except IOError:
print("Couldn't open " + cpp_name + ' for reading.')
sys.exit(1)

try:
m_file = open(m_name, 'w')
except IOError:
print("Couldn't open " + m_name + ' for writing.')
sys.exit(1)

# Translate the cpp file

make_m_file(cpp_file, m_file)

# Finish

print("Done.")

cpp_file.close()
m_file.close()


if __name__ == '__main__':
main()

在该名称的以下文件上运行 ./enummaker.py testenum.cpp:

/* Random code here */

enum LogID {
LOG_ID_ITEM1=0,
LOG_ID_ITEM2,
LOG_ID_ITEM3=10,
LOG_ID_ITEM4
};

/* More random code here */

enum Stuff {
STUFF_ONE,
STUFF_TWO,
STUFF_THREE=99,
STUFF_FOUR,
STUFF_FIVE
};

/* Yet more random code here */

生成包含以下内容的文件 testenum.m:

LOG_ID_ITEM1=0;
LOG_ID_ITEM2=1;
LOG_ID_ITEM3=10;
LOG_ID_ITEM4=11;
STUFF_ONE=0;
STUFF_TWO=1;
STUFF_THREE=99;
STUFF_FOUR=100;
STUFF_FIVE=101;

此脚本假定 enum block 的右大括号始终在单独的行上,第一个标识符在左大括号之后的行中定义,并且在大括号,enum 出现在一行的开头,= 和数字后面没有空格。很容易修改脚本来克服这些限制。您可以让您的 makefile 自动运行它。

关于用于将枚举元素名称和值保存到文件的 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18797441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com