【问题标题】:Using define macro and its value in quotes在引号中使用定义宏及其值
【发布时间】:2019-01-25 10:48:39
【问题描述】:

出于好奇而编写一些 C 代码,我想将 MySQL 连接的一些值移动到一种 const

问题 1 在预处理器宏中存储主机、用户等是个好主意吗?即:

#include <my_global.h>
#include <mysql.h>

#define DB_HOST "mysqlhost.com"
#define DB_USER "mysqlusername"
#define DB_TABLE "tablename"
...

以后像mysql_real_connect(con, DB_HOST, DB_USER, DP_PASS, DB_NAME, 0, NULL, 0) == NULL)一样使用它们 ?

问题 2

我可以在带引号的字符串中使用DB_TABLE 的值吗? IE。 mysql_query(con, "SELECT * FROM DB_TABLE")

如果是这样 - 在这里使用它的正确方法是什么?

【问题讨论】:

标签: c macros preprocessor-directive


【解决方案1】:

答案 1: 从技术上讲,您可以按照您展示的方式定义它,但有时,将可能更改的参数(如主机名、用户名)作为环境变量是有意义的和read them during the program execution。这使您的程序对频繁更改更加健壮。保持不变的参数肯定可以用作#define 预处理器(如表名)。

可以在here找到样本。

答案 2: 不,你不能那样使用它。但是,由于预处理器 MACROS 是编译时替换,因此您可以利用字符串连接,例如

mysql_query(con, "SELECT * FROM " DB_TABLE);

其中DB_TABLE 定义为宏。

【讨论】:

    【解决方案2】:

    在预处理器宏中存储主机、用户等是个好主意吗?

    这是一种常见的做法,至少在程序上下文中值可以被认为是常量的情况下。

    或者,您可以通过以下方式定义常量:

    const char * db_host = "localhost";
    

    这里的缺点是如下所示的简单串联是行不通的。

    我可以在带引号的字符串中使用DB_TABLE 的值吗?

    不,但你可以这样做:

    mysql_query(con, "SELECT * FROM " DB_TABLE);
    

    【讨论】:

    • @SouravGhosh:绝对!
    • 我不认为在 MACROS 中存储主机名和用户名等值是常见的做法! ...这对于非常小的应用程序很常见... ;)
    • @SirJoBlack:好吧,我将问题概括为#define 字符串是否常见。如果对主机名或用户名这样做有意义至少取决于....改写了我的答案。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多