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

Posted

技术标签:

【中文标题】如何在不同文件中使用 #define 等宏在 Visual Studio for C++ 中生成重复代码【英文标题】:How to generate repeated code in Visual Studio for C++ using macros like #define in different files 【发布时间】:2021-08-06 04:46:01 【问题描述】:

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

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++ 的所有内容都是关于低 lvl 内容的信息。感谢您提供信息。

【问题讨论】:

您可以使用一些宏魔法来实现类似的目标。但是,仅将它用于两种方法变体(set/get)和数字列表可能比相应的复制粘贴花费更长的时间,并且使事情实际上不可读。请说明您想要实现的目标。这个问题给人的印象是你想节省打字,在我看来,这对我能提供的解决方案来说并不是一个好的回报。但是,如果您有比节省击键更多的理由,那么它可能是值得的。所以请多解释一下背景和目标。 宏只能让你到目前为止。在某些时候,您需要分解并使用代码生成器。例如,基于 Python 的预构建步骤。你也可以用 C++ 编写这些,但是你需要为你的预构建脚本编写一个构建脚本,它会让人眼花缭乱。 为什么不使用带有类型参数的模板? template<int n> void set_property(); 然后使用set_property<1>();?代码更少。不实例化未使用的函数。没有宏。 set_property(int); 有什么问题?您应该将编译器设置为高度优化,然后打印此函数的汇编代码以及调用此函数的位置。编译器可能已经将其转换为内联操作。 我真的把问题简单化了,以免浪费你的时间。但如果你问,我会解释。我有一个Qt project,我需要将来自不同属性(如 RGB 颜色、不同材料等)的信号连接到不同的插槽中进行渲染。每个 3D 场景中大约有 100 个连接。例如connect (vertex_property, &property_material::property_material_ QPhongMaterial_ambient_signal, component_states_vertex, &component_states :: property_material_ QPhongMaterial_ambient _ slot) 【参考方案1】:

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

在 Visual Studio 19 中的使用。

    从源代码构建 .exe。 在 Windows 设置中的 .exe 文件中添加环境变量,我称之为 MACRO_GENERATOR。 在Visual Studio->项目属性->构建事件->预构建事件添加call %MACRO_GENERATOR% $(ProjectDir),然后项目目录下的所有文件都会被执行。 在第一个字符串中添加单词#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";

    按 build,项目目录中的文件将被替换为新生成的宏。
#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";


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

【讨论】:

以上是关于如何在不同文件中使用 #define 等宏在 Visual Studio for C++ 中生成重复代码的主要内容,如果未能解决你的问题,请参考以下文章

sql*plus 中的 DEFINE_EDITOR=vi

正确使用iOS常量(const)enum以及宏(#define)

为不同的参数值重复SPSS宏

如何使用 VBA 宏在 Excel 表中查找条件累积和

如何使用 Word VBA 宏在列标题下方添加一行并向下移动现有行?

Access中的宏在导入文件时提示输入文件路径