如何让C++预处理器在每行末尾添加一个字符

3

我正在实现一些基于CSV文件的编译时检查,并且我试图以一种有点不规范的方式加载它:

constexpr std::variant<int, const char*> test[] = {
#include "data.csv"
};

其中 "data.csv" 是:

  "a","b","c"
  1,"xyz",1
  2,"abc",0
  3,"def",1

很明显,每行末尾缺少逗号。是否有一种方法可以使用C ++(甚至Boost)预处理器在每行末尾添加逗号?

我知道我可以在每行末尾添加某些标记,然后用#define替换它,但出于清晰起见,我想避免这样做。能否用#define替换\n字符?


2
创建一个预构建步骤,创建一个使用正确格式的(临时)文件,然后可以将其包含进去? - Some programmer dude
2
顺便问一下,这些数据应该代表什么?每一行都是一个单独的记录(结构)吗?那么,变量数组并没有太多意义。 - Some programmer dude
3
使用结构体数组会更加合理。这将使您的代码更易于处理,更易读懂,因此更易于维护。如果需要,还可以添加行为(成员函数)。 - Some programmer dude
1
我知道我可以在每行末尾添加一些标记,然后进行替换,只需添加逗号即可............. - KamilCuk
1
也许你可以使用多行字符串字面量和 constexpr 函数拼凑出一些东西?将整个文件 data.csv 作为单个字符串。字符串标记的开头和结尾必须在 data.csv 中。 - Sebastian
显示剩余7条评论
1个回答

0
有没有办法在每行末尾使用C++(甚至Boost)预处理器添加逗号?
是的,可以创建一个宏:
#define ADD_COMMA(...)  __VA_ARGS__ ,

然后将文件的每一行更改为:

  ADD_COMMA("a","b","c")
  ADD_COMMA(1,"xyz",1)
  ADD_COMMA(2,"abc",0)
  ADD_COMMA(3,"def",1)

如果你的意思是通过预处理器逐行读取文件并在每行上调用某个宏来添加逗号,那么不,这是不可能的。这种功能在C预处理器中是超出范围的。
顺便说一下,你的问题看起来异常琐碎——只需使用外部工具在每行末尾添加逗号即可。

但是,CSV文件变得无效了,所以我只能像@some-programmer-dude建议的那样,在编译时检查的缘故下将其作为预构建步骤执行。在这种情况下,我可以直接在此步骤中添加逗号。 - knopers8
1
CSV文件中不能有空列吗?如果不行,在最后一个逗号后面放置一个标记,可以使用预处理器删除它。 :-) - Sebastian
一个空的列!这其实非常整洁,而且仍然保持了CSV文件的有效性,谢谢。 - knopers8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接