簡體   English   中英

C - 將結構值中的變量名稱作為字符串訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM