为什么 static char* 需要常量初始化,而 static char** 不需要

2024-01-08

有人可以解释一下为什么这段代码...

// main.c

#include <stddef.h>

static const int    g_a   = 1;
static const char*  g_b   = "hello";
static const char*  g_c[] = { "a",    "b",    NULL };

typedef struct Foo
{
  int           a;
  const char*   b;
  const char**  c;
} Foo;

static Foo f[] =
{
  { g_a,
    g_b,
    g_c }
};

int main( int argc, char* argv[] )
{
  return 0;
}

...产生此错误:

> gcc --version && gcc -g main.c 
gcc (GCC) 8.2.1 20181215 (Red Hat 8.2.1-6)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

main.c:19:5: error: initializer element is not constant
     g_b,
     ^~~
main.c:19:5: note: (near initialization for 'f[0].b')

我知道编译器要求constant初始化f[0].b,所以下面的初始化是编译错误的解决方案:

static Foo f[] = { { g_a, "hello", g_c } };

But 为什么编译器在初始化时不发出类似的“constant required”错误f[0].c?(或者,就此而言,f[0].a?) 为什么这只是一个问题f[0].b?


f[0].a具有类型“非常量int" 并由以下值初始化g_a其类型为“constint“它不能在运行时更改,并且在编译时已知。所以这里没有错误。

f[0].b具有类型“非常量指针const char" 并且应该由以下值初始化g_b这也是一个“非常量指针”const char“。即使它有一个初始化程序g_b可以在运行时改变,而IIRC的初始化顺序是不确定的。所以它的值在编译时是未知的,因此会出现错误。

f[0].c具有类型“指向非常量指针的非常量指针const char" 并由以下方式初始化g_c这是一个“非常量指针”类型的元素数组const char”。数组的符号可以用作常量指针,该指针在编译时就已知。所以这里没有错误。

我认为这就是你所缺少的:如果你想要一个指针const,将修饰符放在指针后面*,不是指定值,如下所示:[const] char * const pointer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 static char* 需要常量初始化,而 static char** 不需要 的相关文章

随机推荐

  • 如何在MPandroidchart库中使用图标作为饼图的标签

    我正在使用 mpandroidchart 库来构建饼图 饼图的要求是每个条目中都应包含图标 In my case it is showing up the percentage of each entry values 有什么办法可以将标签
  • node.js - ReferenceError:导航器未定义

    我越来越ReferenceError 导航器未定义在node js上运行以下代码 navigator geolocation getCurrentPosition data gt console log data 我认为问题在于导航器 地理
  • 灯箱图片下载

    我在多个图片库中使用 Lightbox 2 我想为我的用户提供一种在灯箱中查看图像时下载图库中的图像的方法 如果有一个 下载 按钮就完美了 我把它想象在标题附近 问题是我对Javascript很烂 这个项目是一个不经常使用的内部工具 我自愿
  • Bokeh:将变量传递给小部件的 CustomJS

    Bokeh 的一个好处是 可以从 Python 层指定回调 从而在 javascript 级别上产生操作 而无需 bokeh 服务器 因此 人们可以创建在浏览器中运行的交互式小部件 而无需运行 Ipython 或 Bokeh 服务器 0 9
  • 如何从 Pandas 字典中存在的数据框列中删除单词

    扩展至 从字符串中删除单词列表 https stackoverflow com questions 25346058 removing list of words from a string 我有以下数据框 我想从 df name 列中删除
  • MongoDB 嵌入式集合的首选模式。文档与数组

    我相信至少有两种方法可以在 mongodb 文档中嵌入数据 在一个简化的情况下 我们可以有这样的东西 name bill lines idk73716 name Line A idk51232 name Line B idk23321 na
  • Thrift python 3.4 TypeError:需要字符串参数,得到“字节”

    我正在尝试阿帕奇节俭 https thrift apache org 使用 Thrift 似乎支持的 python 3 4 因为它有lib linux x86 64 3 4 under build目录 但我不断收到此错误消息 File ho
  • 如何将整个脚本放入循环中?

    我在编码方面没有任何经验 但我把我的野心用 python 编写了一些游戏代码 一切都很完美 D 但我有一个问题 我不知道如何无限重复代码 我在网上查了一下 但不太明白 我将在这里展示部分代码 也许有人可以解释我如何将所有代码放入 重复 中
  • C# 用户不活动的时间有多久

    一些背景 我正在编写一个具有多种表单等的应用程序 用户必须登录才能使用大部分功能 到目前为止效果很好 然而 现在 客户端请求用户在一定时间的不活动时间后注销 问题是用户仍然可以在计算机上处 于活动状态 只是不能在我的应用程序中处于活动状态
  • 具有相等填充的线性布局中的子项

    我目前正在设计一个带有 5 个按钮的 ButtonBar 它们都是 ImageButton 但目前只有 3 个 这是我的第一个 Android 项目 所以我一边做一边学习 我试图平均分配每个按钮的权重 而不缩放它们 具有相等的填充而不是相等
  • 在重新启动时保留应用程序状态

    我一直在尝试通过序列化我的主应用程序来保留 iPhone 应用程序的状态UITabBarController using NSKeyedArchiver archiveRootObject toFile 但我遇到了困难 首先我遇到了一个问题
  • 在 NetBeans 上使用 Armadillo 库编译 C++

    我将编译包含犰狳库的 C 程序 通过命令行使用以下命令可以解决此问题 g arm cpp o example O1 larmadillo 但是 当我将 O1 larmadillo 添加到 NetBeans 项目的编译选项时 出现了大量错误
  • 将 csv 导入到 iPhone 的 coredata sqlite

    如何将 csv 导入到 sqlite iPhone 的核心数据 我尝试过使用 SQLite 管理器 但它将 csv 导入到新表中 我还需要导入一些日期 那么如何将数据导入到我的sqlite数据库中呢 我有 3 个具有不同属性的实体 并且在
  • 为什么 a++++b 不起作用?

    int main int a 5 b 2 printf d a b return 0 此代码给出以下错误 错误 需要左值作为增量操作数 但如果我在整个过程中添加空格a and b 然后就可以正常工作了 int main int a 5 b
  • Android - 启动时启动服务

    从我在 Stack Exchange 和其他地方看到的一切来看 我已经正确设置了所有内容 以便在 Android 操作系统启动时启动 IntentService 不幸的是它没有在启动时启动 并且我没有收到任何错误 也许专家可以帮忙 显现
  • 通过 SVD 从基本矩阵中提取翻译的正确方法

    我校准了相机并找到了内部参数 K 我还计算了基本矩阵 F 现在 E K T F K 到目前为止 一切都很好 现在我们将基本矩阵 E 传递给 SVD 以使用分解值 U W V 来提取旋转和平移 essentialMatrix K Transp
  • 是否可以获得正在运行的进程及其符号表的核心转储?

    是否可以获取 gdb 或使用其他一些工具来创建正在运行的进程及其符号表的核心转储 如果有一种方法可以在不终止进程的情况下执行此操作 那就太好了 如果可能的话 您会使用什么命令 我正在尝试在 Linux 机器上执行此操作 Or run gco
  • WPF 列表框包装

    我有一个列表框 在其中使用 ListBox ItemsPanel WrapPanel
  • solr 建议者未返回任何结果

    我已经按照 solr wiki 文章的建议几乎到了这里 http wiki apache org solr Suggester http wiki apache org solr Suggester 我的 solrconfig xml 中有
  • 为什么 static char* 需要常量初始化,而 static char** 不需要

    有人可以解释一下为什么这段代码 main c include