[英]C - accessing variable names in struct values as strings
我有一個結構數組,其中 .act 值不是字符串,而是 function 名稱:
cgi_object_t cgi_machine_learning_handlers[] =
{
{
.path = "schema",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = cgi_ml_schema,
.flags = API_FLAG_NO_SCHEMA,
},
{
.path = "policy.svmattacktypes",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = cgi_ml_policy_svmattacktypes_get,
.flags = API_FLAG_NO_SCHEMA,
}
我正在嘗試以字符串的形式訪問這些 function 名稱——cgi_ml_schema 等。 有沒有辦法做到這一點? 我嘗試在下面使用#,但它抱怨程序中有雜散的'#'。
const char * var = json_object_object_get(request, #(m->act))
response = json_object_object_get(info, #(m->act));
您基本上是在詢問是否可以從指針本身讀取指針的名稱。 讓我們試試吧。 你能告訴我地址 0x55c0c6e93190 的 function 的名稱是什么嗎? 我覺得不是。 任何人也不能,除非相應的名稱存儲在某處的 memory 中。 編譯后變量的名稱不再存在(除非您計划利用調試信息)。
但是您可以嘗試自動存儲名稱以及指針,如下所示:
#include <stdio.h>
typedef int (*fnptr_t)(int a, int b);
typedef struct named_ptr {
fnptr_t ptr;
const char *name;
} named_ptr;
named_ptr make_named_ptr(fnptr_t ptr, const char *name) {
named_ptr p = {ptr, name};
return p;
}
#define MAKE_NAMED_PTR(x) make_named_ptr(x, #x)
typedef struct cgi_object_t {
char *path;
int grp, r_vdom, r_global;
named_ptr act;
int flags;
} cgi_object_t;
enum dummy {ACC_GRP_ML, VDOM_PER_VDOM, API_FLAG_NO_SCHEMA};
int cgi_ml_schema(int a, int b) { return 0; }
int cgi_ml_policy_svmattacktypes_get(int a, int b) { return 0; }
int main(void)
{
cgi_object_t cgi_machine_learning_handlers[] = {
{
.path = "schema",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = MAKE_NAMED_PTR(cgi_ml_schema),
.flags = API_FLAG_NO_SCHEMA,
},
{
.path = "policy.svmattacktypes",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = MAKE_NAMED_PTR(cgi_ml_policy_svmattacktypes_get),
.flags = API_FLAG_NO_SCHEMA,
}
};
for (size_t i = 0; i < 2; ++i) {
cgi_object_t *m = cgi_machine_learning_handlers + i;
printf("%s is at address %p\n", m->act.name, m->act.ptr);
}
return 0;
}
我真的猜到並編造了很多東西,但想法就在那里。 下一次,您應該提供一個Minimal, Reproducible Example 。
在這里測試一下。
如果您的編譯器支持它們,則 function 調用可以替換為復合文字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.