出于学习目的,我希望项目包含多个源文件,每个文件都有自己的main
函数。怎么可能实现这个目标?
我要做的是将所有C文件放在同一个项目中,并有选择地编译我目前正在处理的文件。或者更好的是,将文件的名称作为参数提供给程序,以便它可以执行它:
例如在我的main.c
我想要(sample*_main
个函数位于不同的文件中):
int main(int argc, char ** argv) {
if (argc > 0) {
if (strstr(argv[0], "sample1")) return sample1_main(argc, argv);
else if (strstr(argv[0], "sample2")) return sample2_main(argc, argv);
// etc...
}
printf("Not sure what I should run.\n");
return -1;
}
然后像这样执行程序:main.exe
sample1
当编译此类项目时,我遇到的问题是“多个定义”错误,当某些函数在sample * .c文件之间共享名称时。
答案 0 :(得分:0)
你似乎正走在正确的道路上。
为了实现目标,您可以采用以下方式:
main()
重命名为sample1_main()
,sample2_main()
...(这可以避免multiple definition of
错误btw)main()
sample1
,sample2
,...(对于gcc,选项{{1} }指定可执行文件的名称)-o
或sample1
或....无需传递ayn参数。就是这样! : - )
此行为的原因是sample2
是可执行文件本身的名称。
答案 1 :(得分:0)
听起来您希望能够选择在运行时执行的“main”函数,而不是编译时。一种方法是将它们定义为单独的“入口点”函数,然后根据命令行参数选择在main
函数中运行的函数。
所以你要定义main.c,sample1.c,sample2.c等,在main.c中你会有这样的东西:
int main(int argc, char **argv) {
char *methodToExecute;
if (argc < 2) {
printf("usage: main.exe <sample_name>\n");
exit(-1);
}
methodToExecute = argv[1]; /* argv[0] is 'main.exe' */
if (strcmp(methodToExecute, "sample1") == 0) {
return sample1();
}
else if (strcmp(methodToExecute, "sample2") == 0) {
return sample2();
}
/* etc. */
else {
printf("method not found: %s\n", methodToExecute);
exit(-1);
}
}
答案 2 :(得分:0)
您可以将宏用于其他文件中的主要功能。编译为库时,将其定义为sample1_main
(使用gcc -D选项),否则定义为main
。尝试类似的事情,
sm1.c:
#include <stdio.h>
#ifndef S1_MAIN
#define S1_MAIN main
#endif
int S1_MAIN( int argc, char ** argv)
{
printf( "This is (sample1_main)\n" );
return 0;
}
sm2.c:
#include <stdio.h>
#ifndef S2_MAIN
#define S2_MAIN main
#endif
int S2_MAIN( int argc, char ** argv)
{
printf( "This is (sample2_main)\n" );
return 0;
}
main.c中:
#include <stdio.h>
#include <string.h>
int sample1_main(int , char ** );
int sample2_main(int , char ** );
int main(int argc, char ** argv)
{
if (argc > 1)
{
if (strstr(argv[1], "sample1")) return sample1_main(argc, argv);
else if (strstr(argv[1], "sample2")) return sample2_main(argc, argv);
}
printf("Not sure what I should run.\n");
return 0;
}
编译: (作为单个二进制文件)
gcc -Wall -DS1_MAIN="sample1_main" -DS2_MAIN="sample2_main" main.c sm1.c sm2.c -o main
./main
Not sure what I should run.
./main sample1
This is (sample1_main)
./main sample2
This is (sample2_main)
编译: (作为单独的二进制文件)
gcc -Wall sm2.c -o sm2
gcc -Wall sm1.c -o sm1
./sm1
This is (sample1_main)
./sm2
This is (sample2_main)
注意:我已修复主文件以检查命令行参数。