如何在不同文件中使用 #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.
中的用法
- 从源代码构建 .exe。
- 在 Windows 设置中将环境变量添加到 .exe 文件,我称之为 MACRO_GENERATOR。
- 在Visual Studio->project Properties->Build Events->Pre-Build Event中添加
call %MACRO_GENERATOR% $(ProjectDir)
然后Project目录下的所有文件都会被执行
- 在第一个字符串中添加单词
#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";
}
- 按构建,项目目录中的文件将被新生成的宏替换。
#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";
}
- 小心! :) 只添加了很少的检查。生成命令的文本必须非常接近示例。
我需要在一个文件中编写代码,例如:
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.
中的用法- 从源代码构建 .exe。
- 在 Windows 设置中将环境变量添加到 .exe 文件,我称之为 MACRO_GENERATOR。
- 在Visual Studio->project Properties->Build Events->Pre-Build Event中添加
call %MACRO_GENERATOR% $(ProjectDir)
然后Project目录下的所有文件都会被执行 - 在第一个字符串中添加单词
#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";
}
- 按构建,项目目录中的文件将被新生成的宏替换。
#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";
}
- 小心! :) 只添加了很少的检查。生成命令的文本必须非常接近示例。