我可以在C中编译选定的标头代码吗?

时间:2016-03-23 13:45:58

标签: c gcc compilation

我在C中有一个使用ocilib和mysql标头的代码。 在我的一些机器上,我没有ocilib或mysql,我希望能够选择使用/不使用标头编译我的代码,我可以这样做吗? 需要说代码中有定义的ocilib和mysql,所以我可能也想在编译时把它们放出来。

示例:

#include <regex.h>
#include <time.h>
#include <ocilib.h>


void main(){
MYSQL *conn;
OCI_Connection* cn;
OCI_Statement* st;
char *db_type=NULL;
.....
....
if (strcasestr(db_type,"mysql")){/* mysql */
if (!mysql_real_connect(conn, db_host,db_user, db_password, db_schemata, 0, NULL, 0)) {
        syslog (LOG_NOTICE,"%s\n", mysql_error(conn));
        return;
    }
....
}else{/* oracle*/
OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
....
}
}

我希望我很清楚.. 谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将条件编译指令(#ifdef ... #endif作为规范)插入代码中,以选择性地启用或禁用相关#include指令的编译。正如@MichaelWalz在评论中所观察到的那样,仅仅删除标题可能会破坏代码的其余部分 - 如果它没有,那么你应该删除那些#include

此外,如果您在特定环境中没有标头,那么您似乎也没有包含这些标头声明的函数的库。假设您包含标题,因为您的代码依赖于其中一些函数,那么在编译程序,标题或无标题后,您将无法链接该程序。

条件编译解决方案因此只有在您的代码中所需的任何地方使用它时才能使用,以消除对给定库的功能的所有依赖,包括相关的头文件。这种方法相对常见,但要改装到最初没有为其设计的系统上并不容易。