如何在不同文件中使用 #define 等宏在 Visual Studio 中为 C++ 生成重复代码

How to generate repeated code in Visual Studio for C++ using macros like #define in different files

我需要在一个文件中编写代码,例如:

void set_property_1();
void set_property_2();
void set_property_3();
...
void set_property_100();

并在另一个文件中使用 get_。

void get_property_1();
void get_property_2();
void get_property_3();
...
void get_property_100();

为了让它更快一点,我做了一个宏,比如

#define SET(num) void set_property_##num();
#define GET(num) void get_property_##num();
SET(1)
SET(2)
 ...
SET(10)

GET(1)
GET(2)
 ... 
GET(10)

有点帮助。 问题是,如何以更通用的方式生成这样的代码? 喜欢

//pseudocode
//in third file
#define LIST = {1,2,3,4,5,6,7,8,9,10}

//In first file;
MACRO_FOR(AUTO L: LIST)SET(L)

//In second file;
MACRO_FOR(AUTO L: LIST)GET(L)

我正在使用 VisualStudio,所以可能有一些扩展吗?或者一些图书馆?我在 searchnig codegeneration c++ 中找到的所有内容都是关于低级别内容的信息。感谢提供信息。

作为结果,一个功能可以满足我的要求。从任意数量的名称集中生成没有排列的所有组合,以制作唯一的不重复的宏:D。我把它放在这里。可能会对某人有所帮助。 The repo.

Visual Studio 19.

中的用法
  1. 从源代码构建 .exe。
  2. 在 Windows 设置中将环境变量添加到 .exe 文件,我称之为 MACRO_GENERATOR。
  3. 在Visual Studio->project Properties->Build Events->Pre-Build Event中添加call %MACRO_GENERATOR% $(ProjectDir)然后Project目录下的所有文件都会被执行
  4. 在第一个字符串中添加单词 #GENERATE 并像这样使用 //#define[]//#for
#GENERATE
#define ADD_FUNC(NAME,PROPERTY) void f_##NAME##_##PROPERTY(){};
#define ADD_FUNC2(NAME,PROPERTY,WEIGHT) void f_##NAME##_##PROPERTY##_##WEIGHT();
#define ADD_FUNC3(NAME,PROPERTY,WEIGHT,KLMN) void f_##NAME##_##PROPERTY##_##WEIGHT##_##KLMN();

//#define[] NAME one,two
//#define[] COLOR red,green,blue
//#define[] WEIGHT low,big,very_nice
//#define[] KLMN K,L,M,N

//#for ADD_FUNC(NAME, COLOR)
//#for ADD_FUNC2(NAME,COLOR,WEIGHT)
//#for ADD_FUNC3(NAME,COLOR,WEIGHT,KLMN)

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}
  1. 按构建,项目目录中的文件将被新生成的宏替换。
#define ADD_FUNC(NAME,PROPERTY) void f_##NAME##_##PROPERTY(){};
#define ADD_FUNC2(NAME,PROPERTY,WEIGHT) void f_##NAME##_##PROPERTY##_##WEIGHT();
#define ADD_FUNC3(NAME,PROPERTY,WEIGHT,KLMN) void f_##NAME##_##PROPERTY##_##WEIGHT##_##KLMN();

//NAME one,two
//COLOR red,green,blue
//WEIGHT low,big,very_nice
//KLMN K,L,M,N

// ADD_FUNC(NAME, COLOR) START GENERATION
 ADD_FUNC(one,red)
 ADD_FUNC(one,green)
 ADD_FUNC(one,blue)
 ADD_FUNC(two,red)
 ADD_FUNC(two,green)
 ADD_FUNC(two,blue)
// ADD_FUNC(NAME, COLOR) END GENERATION

// ADD_FUNC2(NAME,COLOR,WEIGHT) START GENERATION
 ADD_FUNC2(one,red,low)
 ADD_FUNC2(one,red,big)
 ADD_FUNC2(one,red,very_nice)
 ADD_FUNC2(one,green,low)
 ADD_FUNC2(one,green,big)
 ADD_FUNC2(one,green,very_nice)
 ADD_FUNC2(one,blue,low)
 ADD_FUNC2(one,blue,big)
 ADD_FUNC2(one,blue,very_nice)
 ADD_FUNC2(two,red,low)
 ADD_FUNC2(two,red,big)
 ADD_FUNC2(two,red,very_nice)
 ADD_FUNC2(two,green,low)
 ADD_FUNC2(two,green,big)
 ADD_FUNC2(two,green,very_nice)
 ADD_FUNC2(two,blue,low)
 ADD_FUNC2(two,blue,big)
 ADD_FUNC2(two,blue,very_nice)
// ADD_FUNC2(NAME,COLOR,WEIGHT) END GENERATION

// ADD_FUNC3(NAME,COLOR,WEIGHT,KLMN) START GENERATION
 ADD_FUNC3(one,red,low,K)
 ADD_FUNC3(one,red,low,L)
 ADD_FUNC3(one,red,low,M)
 ADD_FUNC3(one,red,low,N)
 ADD_FUNC3(one,red,big,K)
 ADD_FUNC3(one,red,big,L)
 ADD_FUNC3(one,red,big,M)
 ADD_FUNC3(one,red,big,N)
 ADD_FUNC3(one,red,very_nice,K)
 ADD_FUNC3(one,red,very_nice,L)
 ADD_FUNC3(one,red,very_nice,M)
 ADD_FUNC3(one,red,very_nice,N)
 ADD_FUNC3(one,green,low,K)
 ADD_FUNC3(one,green,low,L)
 ADD_FUNC3(one,green,low,M)
 ADD_FUNC3(one,green,low,N)
 ADD_FUNC3(one,green,big,K)
 ADD_FUNC3(one,green,big,L)
 ADD_FUNC3(one,green,big,M)
 ADD_FUNC3(one,green,big,N)
 ADD_FUNC3(one,green,very_nice,K)
 ADD_FUNC3(one,green,very_nice,L)
 ADD_FUNC3(one,green,very_nice,M)
 ADD_FUNC3(one,green,very_nice,N)
 ADD_FUNC3(one,blue,low,K)
 ADD_FUNC3(one,blue,low,L)
 ADD_FUNC3(one,blue,low,M)
 ADD_FUNC3(one,blue,low,N)
 ADD_FUNC3(one,blue,big,K)
 ADD_FUNC3(one,blue,big,L)
 ADD_FUNC3(one,blue,big,M)
 ADD_FUNC3(one,blue,big,N)
 ADD_FUNC3(one,blue,very_nice,K)
 ADD_FUNC3(one,blue,very_nice,L)
 ADD_FUNC3(one,blue,very_nice,M)
 ADD_FUNC3(one,blue,very_nice,N)
 ADD_FUNC3(two,red,low,K)
 ADD_FUNC3(two,red,low,L)
 ADD_FUNC3(two,red,low,M)
 ADD_FUNC3(two,red,low,N)
 ADD_FUNC3(two,red,big,K)
 ADD_FUNC3(two,red,big,L)
 ADD_FUNC3(two,red,big,M)
 ADD_FUNC3(two,red,big,N)
 ADD_FUNC3(two,red,very_nice,K)
 ADD_FUNC3(two,red,very_nice,L)
 ADD_FUNC3(two,red,very_nice,M)
 ADD_FUNC3(two,red,very_nice,N)
 ADD_FUNC3(two,green,low,K)
 ADD_FUNC3(two,green,low,L)
 ADD_FUNC3(two,green,low,M)
 ADD_FUNC3(two,green,low,N)
 ADD_FUNC3(two,green,big,K)
 ADD_FUNC3(two,green,big,L)
 ADD_FUNC3(two,green,big,M)
 ADD_FUNC3(two,green,big,N)
 ADD_FUNC3(two,green,very_nice,K)
 ADD_FUNC3(two,green,very_nice,L)
 ADD_FUNC3(two,green,very_nice,M)
 ADD_FUNC3(two,green,very_nice,N)
 ADD_FUNC3(two,blue,low,K)
 ADD_FUNC3(two,blue,low,L)
 ADD_FUNC3(two,blue,low,M)
 ADD_FUNC3(two,blue,low,N)
 ADD_FUNC3(two,blue,big,K)
 ADD_FUNC3(two,blue,big,L)
 ADD_FUNC3(two,blue,big,M)
 ADD_FUNC3(two,blue,big,N)
 ADD_FUNC3(two,blue,very_nice,K)
 ADD_FUNC3(two,blue,very_nice,L)
 ADD_FUNC3(two,blue,very_nice,M)
 ADD_FUNC3(two,blue,very_nice,N)
// ADD_FUNC3(NAME,COLOR,WEIGHT,KLMN) END GENERATION

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

  1. 小心! :) 只添加了很少的检查。生成命令的文本必须非常接近示例。