c - 在 C 中定义常量数组

标签 c linux

我知道,SO 中有一些类似主题的问题,但没有一个真正回答问题。

通常你定义一个常量数组如下:

const char arr[] = {0x00, 0x01, 0x02, 0x03}

我可以使用 #define 指令来做完全相同的事情吗?”这个问题的回答大多是简单的,但是我偶然发现了一个头文件lxr,正在寻找一个结构。那是我发现这个的时候:

extern const struct in6_addr in6addr_any;
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
extern const struct in6_addr in6addr_loopback;
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
extern const struct in6_addr in6addr_linklocal_allnodes;
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
    { { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
extern const struct in6_addr in6addr_linklocal_allrouters;
#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
    { { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
extern const struct in6_addr in6addr_interfacelocal_allnodes;
#define IN6ADDR_INTERFACELOCAL_ALLNODES_INIT \
    { { { 0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
extern const struct in6_addr in6addr_interfacelocal_allrouters;
#define IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT \
    { { { 0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
extern const struct in6_addr in6addr_sitelocal_allrouters;
#define IN6ADDR_SITELOCAL_ALLROUTERS_INIT \
    { { { 0xff,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
#endif

(在 http://elixir.free-electrons.com/linux/v4.12-rc6/source/include/linux/in6.h 找到)

这是否只在内核中有效,或者是否有特定的方法可以对任何阵列完成此操作?

最佳答案

上面显示的#defines 用作初始化特定类型结构的简写。

使用你给出的例子:

const char arr[] = {0x00, 0x01, 0x02, 0x03}

您还可以执行以下操作:

#define ARR_INIT {0x00, 0x01, 0x02, 0x03}
const char arr[] = ARR_INIT;

关于c - 在 C 中定义常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44727295/

相关文章:

c - C中带有nftw函数的目录递归路径

c - 读取文本的第一行并将其转换为 int,但返回另一个值 [C]

c - 多线程中某些内容的延迟失效

php - 检查用户是否对 *nix 中的文件有权限

linux - 用于处理两个文件并循环进行挂载点检查的 Bash 脚本

linux - 使用printf和ld链接程序?

c - 使用 execl 运行 Linux 命令

c - 如何正确分配结构体和某些变量?

linux - 列出特定 OpenSSL 构建支持的 SSL/TLS 版本

c - 使用 procfs 从内核读取时间戳 - 从内核读取后它存储在哪里?