包含的C文件也可以直接运行吗?

时间:2017-11-10 21:04:08

标签: c include main

我想知道C文件是否可以在另一个脚本(通过头文件)中包含,并且还可以独立运行(通过拥有自己的主要功能)。也就是说,可以包含C文件以将其功能提供给另一个C脚本,但也可以直接运行以提供一些备用功能。

例如,python脚本可以执行此操作;

def functionsToBeImported():
    # code to be run by an importing script
    pass

if __name__ == '__main__':
    # code to be run by this script independently
    pass

此代码可以由另一个python文件导入(import ABOVESCRIPT)以提供对functionsToBeImported的访问,或者可以独立运行(python ABOVESCRIPT.py)以执行if中的代码块。

我已尝试通过 myScript.c 在C中执行此操作:

#include "myScript.h"

void functionsToBeImported() {
}

int main (int narg, char* varg[]) {
}

myScript.h

#ifndef MY_SCRIPT_H_
#define MY_SCRIPT_H_

void functionsToBeImported();

#endif // MY_SCRIPT_H_

但尝试将其包含在 anotherScript.c

#include "myScript.h"

int main (int narg, char* varg[]) {

    functionsToBeImported();
}

并尝试通过

进行编译
gcc -std=c99 -c myScript.c
gcc -std=c99 -c anotherScript.c
gcc -std=c99 -o anotherScript anotherScript.o myScript.o -lm

给出了编译错误

duplicate symbol _main in:
    myScript.o
    anotherScript.o

我怎样才能实现这一目标'重复使用'脚本?

2 个答案:

答案 0 :(得分:1)

注意:C文件不是脚本。

你不能有两个主要功能,因为C是一种过程语言,这意味着你必须一次做一件事(除非你是多线程的,在这种情况下你仍然只有一个主函数)。

但是,有一些非常接近复制你想要的东西。您可以做的是首先,仅在第一个包含的文件中编写main方法。在主文件中,将a stxlib.h文件(在main的末尾调用另一个函数)中的atexit()函数设置为main2()函数(确保每个main#()函数都有一个原型在第一个标题中,并最终实现所有功能)。在具有原始main的函数中定义一个名为MAIN_ONE的宏。在每个连续包含的文件中,实现下一个main并创建一个宏,以便检查是否可以实现该函数。但是,用C语言编写程序的自然而有效的方法就是只有一个主函数。

实施例:     //在第一个包含的文件中     #include //某些IDE会自动包含此内容。必须包含它,因为它是atexit()函数所在的位置

#define MAIN_ONE
void main2(); //For the moment, this is only a prototype.
void main3(); 
//etc. Until you have created the maximum number of main functions that you can have
int main() {
    //do something
    atexit(main2); // This will execute the function main1() once main returns
    //All "fake" mains must be void, because atexit() can only receive void functions
}

//In second included file
#if defined(MAIN_THREE) //start from the maximum number of main functions possible
    #define MAIN_THREE //The define is for preprocessor-checking purposes
    void main4() {
        atexit(main5);
    }
#elif defined(MAIN_TWO) //start from the maximum number of main functions possible
    #define MAIN_TWO
    void main3() {
        atexit(main5);
    }
//Keep repeating until you reach #ifdef(MAIN_ONE)
#endif

//At the bottom of the main C file
//This is done in order to make sure that all functions have actually been created and reside in memory so that an error does not occur
//(all unused functions are initialized with an empty function here)
#if defined(MAIN_THREE) //start from the maximum number of main functions possible
    //Do nothing because if MAIN_THREE is defined when main4(), the last main in my example has already been implemented.
    //Therefore, no more functions need to be created
#elif defined(MAIN_TWO) //start from the maximum number of main functions possible
    #define MAIN_TWO //Since more mains after main2 can be present, another macro for future checks needs to be defined
    void main3() {
    }
//Keep repeating until you reach #ifdef(MAIN_ONE)
#endif

答案 1 :(得分:1)

您无法同时关联anotherScript.omyScript.o,但您可以执行以下操作:

#define main ignored_main
// Include myScript.c, not myScript.h
#include "myScript.c"
#undef main

int main (int narg, char* varg[]) {

    functionsToBeImported();
}

我实际上已经在生产中广泛使用的代码中看到了这样的东西,虽然我不推荐这种风格(但它有时候是一个诱人的捷径)。

另一个选择是仅在定义了预处理器宏时才包含main函数,如下所示(在myScript.c中):

#include "myScript.h"

void functionsToBeImported() {
}

#ifdef USE_MAIN
int main (int narg, char* varg[]) {
}
#endif // USE_MAIN

这与Python方法的精神相似。但同样,您必须将此文件两次编译为单独的目标文件。