作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常我尽量避免使用宏,所以除了最基本的宏之外,我实际上不知道如何使用它们,但我正在尝试进行一些元操作,所以我认为需要宏。
我有一个枚举,列出了各种日志条目及其各自的 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/
我是一名优秀的程序员,十分优秀!