C语言中带宏的concat代码
事情是这样的: 假设我在C中定义了两个函数:C语言中带宏的concat代码,c,c-preprocessor,C,C Preprocessor,事情是这样的: 假设我在C中定义了两个函数: test_1() {}; test_2() {}; 我希望有一个宏(例如NUM_TEST),它将引用测试编号。最好的方法是用代码显示它: #define NUM_TEST 1 test_1() {}; test_2() {}; int main() { test_ ## NUM_TEST ## () } 如果有人能帮忙,我会很感激,找到一个解决方案,如何用宏来定义函数名 编辑: 让它更清楚。我只想通过更改“macro NUM_TEST
test_1() {};
test_2() {};
我希望有一个宏(例如NUM_TEST),它将引用测试编号。最好的方法是用代码显示它:
#define NUM_TEST 1
test_1() {};
test_2() {};
int main() {
test_ ## NUM_TEST ## ()
}
如果有人能帮忙,我会很感激,找到一个解决方案,如何用宏来定义函数名
编辑:
让它更清楚。我只想通过更改“macro NUM_TEST”来更改TEST_1()和TEST_2()之间调用的函数
是的,我知道有更简单的方法可以做到这一点,但这只是更一般问题的一个例子:如何在不添加新行或新宏函数的情况下用C语言将宏与文本连接起来
编辑2:
显然我现在已经够清楚了。比如说我写了一个程序。它有两种(或更多)运行类型。我有一个宏名为NUM_TEST。通过将提到的宏设置为1或2,可以在测试_1()或测试_2()之间选择运行类型
谢谢大家! 这就是你要找的吗
#include <stdio.h>
#define TEST(NUM) test_ ## NUM ()
test_1() { printf ("Hello "); }
test_2() { printf ("World!\n"); }
int main (void)
{
TEST(1);
TEST(2);
// Prints "Hello World!\n"
return 0;
}
#包括
#定义测试(NUM)测试(NUM)
test_1(){printf(“Hello”);}
test_2(){printf(“World!\n”);}
内部主(空)
{
试验(1);
试验(2);
//打印“你好,世界!\n”
返回0;
}
这就是你要找的吗
#include <stdio.h>
#define TEST(NUM) test_ ## NUM ()
test_1() { printf ("Hello "); }
test_2() { printf ("World!\n"); }
int main (void)
{
TEST(1);
TEST(2);
// Prints "Hello World!\n"
return 0;
}
#包括
#定义测试(NUM)测试(NUM)
test_1(){printf(“Hello”);}
test_2(){printf(“World!\n”);}
内部主(空)
{
试验(1);
试验(2);
//打印“Hello World!\n”
返回0;
}
与其创建一个决定这一点的宏,不如将表示测试编号的命令行参数传递给它。像这样:
#include <stdio.h>
int main( int argc, char *argv[] )
{
switch(argv[1])
{
case "1" :
Test_1();
break;
case "2" :
Test_2();
break;
default :
printf("Test ID not found");
}
}
这将导致编译器用Test_1替换程序中任何地方的TESTTORUN。与其创建一个确定这一点的宏,不如将表示测试编号的命令行参数传递给它。像这样:
#include <stdio.h>
int main( int argc, char *argv[] )
{
switch(argv[1])
{
case "1" :
Test_1();
break;
case "2" :
Test_2();
break;
default :
printf("Test ID not found");
}
}
这将导致编译器用Test_1替换程序中任何地方的TESTTORUN。为什么人们喜欢宏?害怕编译器?他们通常以眼泪结束。只有几件事是好的。您是否试图根据预处理器指令指定要运行的函数?为什么不用开关呢?你也可以考虑使用一个IF IFF。请阅读你的问题并使其合理。代码> TESTEX.Y.NUMyTestSuxy()需要进入另一个宏定义。请决定一种语言。是C还是C++?宏预处理器是相同的,但您实际想要使用的解决方案可能不同。顺便说一下,你的函数定义在这两种语言中都是无效的。为什么人们喜欢宏?害怕编译器?他们通常以眼泪结束。只有几件事是好的。您是否试图根据预处理器指令指定要运行的函数?为什么不用开关呢?你也可以考虑使用一个IF IFF。请阅读你的问题并使其合理。代码> TESTEX.Y.NUMyTestSuxy()需要进入另一个宏定义。请决定一种语言。是C还是C++?宏预处理器是相同的,但您实际想要使用的解决方案可能不同。顺便说一句,你的函数定义在这两种语言中都是无效的。这似乎是一种相当愚蠢的编码方式(祝你调试顺利)实际上我想做相反的事情,定义一个宏NUM为1或2,我想执行函数test_1()或test_2()。这似乎是一种相当愚蠢的编码方式(祝你调试顺利)实际上,我想做相反的事情,定义一个宏NUM,它是1或2,我想执行函数test_1()或test_2()。这不是一个帮助。当然,我可以使用switch语句或使用整个函数名作为宏。但这不是我的问题。我想问的是,是否有可能将宏值和函数名合并到代码中的某个地方。此外,你的“开关”代码很奇怪。我应该在测试数量和参数数量之间做出决定?所以,如果我想使用测试15,我应该提供14个任意单词?在参数(char*)到测试数(int)之间有任何转换。你是对的,我在写答案时没有足够的注意,我错过了switch语句中的错误,我已经纠正了它。这样做的原因将大大有助于获得更好的答案。如果您只是想使用宏来确定要运行的测试或将测试更改为在运行时运行,我已经给出了这两种方法的解决方案。为什么要根据宏更改函数的名称?你的目标是什么?你似乎不喜欢使用武断的词语,所以这是一些优化问题,因为你在问题中没有提到。这没有帮助。当然,我可以使用switch语句或使用整个函数名作为宏。但这不是我的问题。我想问的是,是否有可能将宏值和函数名合并到代码中的某个地方。此外,你的“开关”代码很奇怪。我应该在测试数量和参数数量之间做出决定?所以,如果我想使用测试15,我应该提供14个任意单词?在参数(char*)到测试数(int)之间有任何转换。你是对的,我在写答案时没有足够的注意,我错过了switch语句中的错误,我已经纠正了它。这样做的原因将大大有助于获得更好的答案。如果您只是想使用宏来确定要运行的测试或将测试更改为在运行时运行,我已经给出了这两种方法的解决方案。为什么要根据宏更改函数的名称?你的目标是什么?你似乎不喜欢使用武断的词语,所以这是一个优化问题,因为你在问题中没有提到这一点。