gpt4 book ai didi

c - 在 C 中,被调用函数可以使调用函数返回吗?

转载 作者:太空狗 更新时间:2023-10-29 15:32:08 25 4
gpt4 key购买 nike

我想找到一种方法使函数返回(具有特定值)调用它的函数。在 C 中有可能吗?也许通过检查调用堆栈?

抽象例子:假设我们有两个函数

int called() {
if (some_check_fails()) {
/* here make caller() return -1 so "Hello world!\n" is not printed */
}
}

int caller() {
called();
printf("Hello world!\n");
return 0;
}

我正在搜索要放入 /* ... */ 部分的内容。

现实生活中的例子:我正在使用的代码是一个将数据导出到 SQLite 文件中的函数。这意味着对 SQLite API 的大量调用需要每次检查它们的返回值。。结果是一个看起来很糟糕且太长的函数,就像这样 if (resp_code != SQLITE_OK) 部分不断重复:

sqlite3 *db;
char *err_msg;

/* Open the database in read-write mode, create it if not exists yet */
int resp_code = sqlite3_open_v2(filename, &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL);
if (resp_code != SQLITE_OK) {
fprintf(stderr, "SQLite error: cannot open database %s, %s\n", filename,
sqlite3_errmsg(db));
sqlite3_close(db);
return OMG_ERROR_HERE;
}

/* Create table */
char *query_table = "DROP TABLE IF EXISTS sometable; "
"CREATE TABLE sometable "
"(value int, data TEXT);";
resp_code = sqlite3_exec(db, query_table, 0, 0, &err_msg);
if (resp_code != SQLITE_OK) {
fprintf(stderr, "SQLite error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return OMG_ERROR_HERE;
}

/* Prepare statement */
char *query = "INSERT INTO sometable VALUES (@i, @s);";
sqlite3_stmt *stmt;
resp_code = sqlite3_prepare_v2(db, query, 150, &stmt, NULL);
if (resp_code != SQLITE_OK) {
fprintf(stderr, "SQLite error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return OMG_ERROR_HERE;
}

/* Start transaction */
resp_code = sqlite3_exec(db, "BEGIN TRANSACTION", 0, 0, &err_msg);
if (resp_code != SQLITE_OK) {
fprintf(stderr, "SQLite error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return OMG_ERROR_HERE;
}

/* AND SO ON */

我想要的是这样的:

sqlite3 *db;
char *err_msg;

/* Open the database in read-write mode, create it if not exists yet */
int resp_code = sqlite3_open_v2(filename, &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL);
return_this_function_if_not_ok(resp_code);

/* Create table */
char *query_table = "DROP TABLE IF EXISTS sometable; "
"CREATE TABLE sometable "
"(value int, data TEXT);";
resp_code = sqlite3_exec(db, query_table, 0, 0, &err_msg);
return_this_function_if_not_ok(resp_code);

/* Prepare statement */
char *query = "INSERT INTO sometable VALUES (@i, @s);";
sqlite3_stmt *stmt;
resp_code = sqlite3_prepare_v2(db, query, 150, &stmt, NULL);
return_this_function_if_not_ok(resp_code);

/* Start transaction */
resp_code = sqlite3_exec(db, "BEGIN TRANSACTION", 0, 0, &err_msg);
return_this_function_if_not_ok(resp_code);

/* AND SO ON */

编辑 2015-12-21:我选择了FUZxxl's answer最好,因为它是唯一一个真正回答我关于返回调用者函数的问题的人。另一方面chux's answer (基于 Rowland Shaw'sZiffusion's )正在以我喜欢的方式解决我的 SQLite 问题。

非常感谢你们所有人!!

最佳答案

这样的事情在 C 中是不可能的,但你可以接近。

标识符__func__在每个函数的开头隐式声明为

static const char __func__[];

它的值是当前函数的字符串形式的名称。您可以编写一个类似函数的宏,将调用者的名称隐式传递给被调用者。如果应该接收调用者姓名的函数类似于:

void error_check_fun(const char *function, int code, int result);

你可以这样写一个宏:

#define error_check(code, result) error_check_fun(__func__, code, result);

同样,__FILE____LINE__分别是扩展到当前源文件和行的宏。

关于c - 在 C 中,被调用函数可以使调用函数返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com