在引号中使用define宏及其值

时间:2019-01-25 10:48:40

标签: c macros preprocessor-directive

出于好奇而编写一些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的值吗?即mysql_query(con, "SELECT * FROM DB_TABLE")

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

2 个答案:

答案 0 :(得分:6)

答案1:从技术上讲,您可以按照显示的方式定义它,但是有时,将可能会更改的参数(例如主机名,用户名)作为环境变量是有意义的和read them during the program execution。这使您的程序在进行频繁更改时更加强大。保持不变的参数肯定可以用作func getFireBaseData(){ db.collection("categories").getDocuments() { (querySnapshot, err) in if let err = err { print("Error getting documents: \(err.localizedDescription)") } else { for document in querySnapshot!.documents { self.categoryDictionary.append(document.data()) } self.tableVu.reloadData() } } } 预处理程序(如表名)。

可以找到一个示例here

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

#define

其中mysql_query(con, "SELECT * FROM " DB_TABLE); 被定义为MACRO。

答案 1 :(得分:4)

  

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

通常是这样,至少在程序上下文中可以将这些值视为常量。

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

const char * db_host = "localhost";

这里的缺点是,如下所示的简单串联无法正常工作。

  

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

否,但是您可以这样做:

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