【问题标题】:concat code with macro in C用 C 中的宏连接代码
【发布时间】:2015-03-12 21:45:25
【问题描述】:

事情是这样的:

假设我在 C 中定义了两个函数:

test_1() {};
test_2() {};

我想要一个宏(例如 NUM_TEST)来引用测试编号。最好的方法是在代码中显示它:

#define NUM_TEST 1

test_1() {};
test_2() {};

int main() {
    test_ ## NUM_TEST ## ()
}

如果有人能提供帮助,我将不胜感激找到解决方案,如何将函数名称与宏连接。

编辑:

为了更清楚。我想通过更改“宏 NUM_TEST”来更改 test_1() 和 test_2() 之间的调用函数。

是的,我知道有更简单的方法可以做到这一点,但这只是更一般问题的一个示例:如何在 C 中将宏与文本连接起来而不添加新行或新宏函数。

编辑 2:

显然我现在已经足够清楚了。假设我写了一个程序。它有两种(或更多)运行类型。我有一个名为 NUM_TEST 的宏。通过将提到的宏设置为 1 或 2,希望在 test_1() 或 test_2() 之间选择运行类型

谢谢!

【问题讨论】:

  • 为什么人们喜欢宏?害怕编译器?他们通常以泪水告终。只对一些事情有好处
  • 您是否尝试根据预处理器指令指定要运行的函数?为什么不直接使用开关?您也可以考虑使用#ifdef。
  • 请阅读您的问题并使其合理
  • test_ ## NUM_TEST ## () 需要进入另一个宏定义。
  • 请选择一种语言。是 C 还是 C++?宏预处理器是相同的,但您实际想要使用的解决方案可能不同。顺便说一句,您的函数定义在任何一种语言中都是无效的。

标签: c c-preprocessor


【解决方案1】:

这是你要找的吗?

#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是1或者2,我想执行函数test_1()或者test_2()。
【解决方案2】:

与其创建一个确定这一点的宏,不如只向它传递代表测试编号的命令行参数。像这样:

#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、Test_2 等。然后只要在您希望所选测试运行的任何地方都有一个通用的 TESTTORUN。在编译时让预处理器用你想要的函数名替换它:

#define TESTTORUN Test_1  //Or Test_2 or whatever

这将导致编译器将程序中的 TESTTORUN 替换为 Test_1。

【讨论】:

  • 这不是帮助。当然,我可以使用 switch 语句或使用整个函数名作为宏。但这不是我的问题。我在问是否可以在代码中的某处将宏值与函数名合并。除了你的“开关”代码很奇怪。我应该根据参数数量来决定测试数量吗?所以如果我想使用 Test_15 我应该提供 14 个任意单词?参数 (char*) 到测试数 (int) 之间存在任何转换。
  • 你说得对,我在写答案时没有给予足够的关注,我错过了 switch 语句中的那个错误,我已经更正了。这样做的原因将大大有助于获得更好的答案。如果您只是想使用宏来确定要运行的测试或更改要在运行时运行的测试,我已经为这两种方法提供了解决方案。为什么要根据宏更改函数的名称?你的目标是什么?您似乎不喜欢使用任意词,所以这是一些优化问题,因为您没有在问题中提到这一点。
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2015-01-15
  • 2015-08-02
相关资源
最近更新 更多