假设我们将一些错误代码定义为宏 -
#define ERR_SUCCESS 0
#define ERR_BAD_INPUT 1
Run Code Online (Sandbox Code Playgroud)
...
或者作为枚举数据类型 -
enum err_t = { ERR_SUCCESS, ERR_BAD_INPUT, ...};
Run Code Online (Sandbox Code Playgroud)
其中一个id由以下函数返回 -
int foo(); /* if foo() returns 0, it means success, etc */
Run Code Online (Sandbox Code Playgroud)
调用者foo()可以确定哪个标识符/名称(ERR_SUCCESS,ERR_BAD_INPUT,...)链接到int返回值?
在下面的程序中,可变参数函数process_message通过va_list argp参数to 传递其变量参数print_message.argp反过来传递给vsnprintf计算格式字符串的长度.
然而,如果argp被传递给从内调用另一个函数print_message,例如vprintf(fmt, argp),它产生无义输出.函数va_list参数可以多次使用吗?
#include <stdio.h>
#include <stdarg.h>
void process_message(const char *fmt, ...);
void print_message(const char *fmt, va_list argp);
int main(void) {
process_message("%s:%d\n", "test message", 1);
return 0;
}
void process_message(const char *fmt, ...) {
va_list argp;
va_start(argp, fmt);
print_message(fmt, argp);
va_end(argp);
}
void print_message(const char *fmt, va_list argp) {
/*Calculate and print the length of the format string*/
int len …Run Code Online (Sandbox Code Playgroud) 是否可以为指向非NULL的地址的指针定义类型?
背景:
我经常写的功能如下 -
output_type *some_function(input_type *input) {
//confirm input and its members were correctly initialised
if (input == NULL) {
// error handling code
}
if (input->member_which_is_a_pointer == NULL) {
// error handling code
}
...
//return output computed from input
}
Run Code Online (Sandbox Code Playgroud)
如果可以编码以下内容将更清楚 -
output_type *some_function(input_type_not_null *input) {
//return output computed from input
}
Run Code Online (Sandbox Code Playgroud) 我已经读过 C不支持动态函数调用.我的程序有越来越多的测试用例作为单独的函数实现,如 -
int testcase1(void);
int testcase2(void);
int testcase3(void);
Run Code Online (Sandbox Code Playgroud)
每次我添加一个新的测试用例时,我还必须将调用添加到我的主函数中,如:
int main(int argc, char **argv){
assert(!testcase1());
assert(!testcase2());
assert(!testcase3());
}
Run Code Online (Sandbox Code Playgroud)
我更愿意调用类似于assert(!testcase*())*匹配任何解析为我的程序中的有效函数名称的字符串.
你能想到一个更方便的解决方案吗?