【问题标题】:main() conditionally compiled creates conflictmain() 条件编译会产生冲突
【发布时间】:2014-06-03 20:53:17
【问题描述】:

项目目录 /lib/mytest.c 中的一个文件包含用于测试目的的条件 main

#ifdef TEST 
int main(int argc, char *argv[])
#endif

所以要测试我在configure.ac文件中添加的代码

AC_DEFINE(TEST, 1,[My description for TEST])

还有其他包含 mytest.h 的文件。当我尝试 autoreconf 然后 ./configure 然后 make 我在 gcc 中得到以下错误:

multiple definition of `main'

这是可以理解的,因为包括 mytest.h 在内的文件中也有 main 函数。我想有一个独立的 mytest 程序用于测试目的。

如何构建项目?我需要在配置和制作文件中进行哪些更改?

谢谢。

【问题讨论】:

  • ........because the files including mytest.h also have main functions in them你的头文件mytest.h还包含main函数?我不明白。
  • no mytest.h 在包含文件夹中并且不包含任何主文件。还有其他包含 mytest.h 的源文件。
  • 好的,那么你在不同文件中的其他主要功能(除了mytest.c),对吧?如果是这样,那么如果某些条件为真,您是否还设置了条件以启用main
  • 其他.c文件中没有main函数不是有条件的。
  • 所以如果你的宏TEST被定义了就会发生冲突。尝试在你的other.c文件中为main提供相反的条件。

标签: c makefile configure autoconf automake


【解决方案1】:

一般来说,跟踪 ifdefs 以定义 main 以允许测试驱动程序是乏味的,而且如您所见,容易出错。

正如评论的那样,您可以将#ifndef TEST 添加到您的其他.c 文件中,并将同一文件包含到可能的defineTEST 中。但是,如果您有第三个或更多测试驱动程序怎么办。

我采用的解决方案更简单,总是有一个main,但让它调用其他不称为main的main函数,例如可以调用常规main函数main_programm你的测试可能是main_test1 和一个小的侧面测试可以是 main_test_tiny_func。为了清楚起见,我通常在所有此类 psudo-main 函数前加上 main_

我偶尔只是使用 cmets 来切换我想使用的伪主,但这会变得很乱。

main.c

int main(int argc, char *argv[])
{
#ifdef TEST1
     return main_test1(argc, argv);
#else
#ifdef TINY_TEST 
     return main_test_tiny_func(argc, argv);
#else
     return main_program(argc, argv);
#endif
#endif
}

或者,如果您有很多测试,您可以设置一个清单常量来决定运行哪个测试

#ifndef TEST_TO_RUN
#define TEST_TO_RUN 0
#endif

int main(int argc, char *argv[])
{
     switch(TEST_TO_RUN)
     case 2:
          return main_test1(argc, argv);
     case 1:
          return main_test_tiny_func(argc, argv);
     case 0:
          return main_program(argc, argv);
     }
}

有时在运行时决定运行哪个(例如回归测试)很有用,在这种情况下,您将使用与上述相同的开关并吃掉第一个参数来决定

int main(int argc, char *argv[])
{
     int test_no=atoi(argv[0]);
     argc--; argv++;
     switch(test_no)
     case 2:
          return main_test1(argc, argv);
     case 1:
          return main_test_tiny_func(argc, argv);
     case 0:
          return main_program(argc, argv);
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多