c - 有没有一种方法可以在不知道 C 语言类型的情况下将变量初始化为默认值?

标签 c preprocessor

我正在研究宏,我设法制作了一个可以与任何类型一起使用的堆栈结构,但问题是我的 POP 函数有问题,它必须弹出将值从堆栈中取出并返回它,因为我使用的是语句表达式。问题是当堆栈为空时,我必须返回默认值,但我不知道变量的类型,所以我不能只返回 NULLINT_MIN 因为它可以是指针、整数、数组或结构。我想要做的是将该变量初始化为默认值,例如静态变量(它们自动初始化为 0{})。这是我为上下文编写的代码。 (该代码可以工作,但当 POP 失败时,它会返回一个未定义的未初始化值,因此无法使用 -Wall -Wextra -Werror 进行编译)

#ifndef STACK_H
# define STACK_H

# include <sys/types.h>
# include <stdint.h>
# include <stdbool.h>
# include <stdlib.h>

# define STACK(type, cap) struct {\
    size_t  capacity;\
    size_t  size;\
    type    data[cap];\
}\

# define STACK_INIT(stack) \
(stack) = (typeof(stack)) {\
    .capacity = sizeof((stack).data) / sizeof(*(stack).data),\
    .size = 0,\
    .data = {}\
}

# define STACK_PUSH(stack, value) ({\
    bool    ret = true;\
\
    if ((stack).size == (stack).capacity) ret = false;\
    (stack).data[(stack).capacity - ++(stack).size] = value;\
    ret;\
})

# define STACK_POP(stack) ({\
    typeof(*(stack).data)   ret;\ // Here ret is declared
\
    if ((stack).size) ret = (stack).data[(stack).capacity - (stack).size--];\
\   // else ret is uninitialized, is it possible to give it a default value without knowing its type?
    ret;\
})

# define STACK_SIZE(stack) stack.size
# define STACK_EMPTY(stack) !stack.size

#endif

简单用法示例:

#include <stdio.h>
#include "stack.h"

int main(int argc, char **argv) {
    if (argc < 2) {
        dprintf(2, "Usage: %s <at least one argument>\n\n", argv[0]);
        return (-1);
    }
    STACK(char *, 10) stk;
    STACK_INIT(stk);
    for (int i = 1; i < argc; ++i)
        if (!STACK_PUSH(stk, argv[i])) {
            dprintf(2, "Failed to push\n\n");
            return (-1);
        }
    while (!STACK_EMPTY(stk))
        printf("%s\n", STACK_POP(stk));
    return (0);
}

最佳答案

我认为这在 C 语言中是不可能的。


但一种解决方案是假设默认值是零字节初始化的,并编写如下代码:

typeof(*(stack).data)   ret;   \
memset(&ret, 0, sizeof(ret));   \

关于c - 有没有一种方法可以在不知道 C 语言类型的情况下将变量初始化为默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69105212/

相关文章:

c++ - 64 位机器上 int 和 sizeof int 指针的大小

c++ - 项目 : C vs C++ 中包含多个相同的头文件

python - 在 Django 的模板加载器中预处理 SHPAML?

preprocessor - 哪个更重要,变量的数量还是子表达式的数量?

c - url在c中编码一个utf-8字符串?

c++ - 禁用 VC++ 2010 项目中特定文件的预编译头文件

c++ - 为什么我们使用内存管理器?

c - 存在 static 关键字时出现意外输出

c# - 如何编写 C# 代码来拦截对构造函数的调用?可能是自定义预处理器或 Roslyn

r - SparkR(Spark 2.1.0 或 2.2.0)中有 MaxAbsScaler 吗?