小编use*_*803的帖子

C程序可以根据其值确定宏标识符/枚举名称吗?

假设我们将一些错误代码定义为宏 -

#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返回值?

c macros enums

3
推荐指数
2
解决办法
180
查看次数

C使用va_list的函数可以多次使用它吗?

在下面的程序中,可变参数函数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)

c variadic-functions

3
推荐指数
1
解决办法
354
查看次数

C是否可以为非NULL指针定义类型?

是否可以为指向非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 pointers typedef

1
推荐指数
2
解决办法
236
查看次数

C有一个允许动态函数调用的变通方法吗?

我已经读过 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*())*匹配任何解析为我的程序中的有效函数名称的字符串.

你能想到一个更方便的解决方案吗?

c function dynamic

0
推荐指数
1
解决办法
179
查看次数

标签 统计

c ×4

dynamic ×1

enums ×1

function ×1

macros ×1

pointers ×1

typedef ×1

variadic-functions ×1