Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在一个指针中存储重复的常量字符串,同时在编译时仍然能够知道其长度?_Arrays_C_String_Pointers_Gcc - Fatal编程技术网

Arrays 如何在一个指针中存储重复的常量字符串,同时在编译时仍然能够知道其长度?

Arrays 如何在一个指针中存储重复的常量字符串,同时在编译时仍然能够知道其长度?,arrays,c,string,pointers,gcc,Arrays,C,String,Pointers,Gcc,我想找到一种在单个位置存储重复常量字符串的方法。然而;我需要在编译器级别获取该字符串的长度(这样,strlen()之类的函数在运行时就找不到该字符串)。如图所示,我知道一种方法可以分别执行这些操作 使用指针在单个地址中存储重复字符串: const char *a = "Hello world."; const char *b = "Hello world."; printf("a %s b\n", a == b ? "==&q

我想找到一种在单个位置存储重复常量字符串的方法。然而;我需要在编译器级别获取该字符串的长度(这样,strlen()之类的函数在运行时就找不到该字符串)。如图所示,我知道一种方法可以分别执行这些操作

使用指针在单个地址中存储重复字符串:

const char *a = "Hello world.";
const char *b = "Hello world.";
printf("a %s b\n", a == b ? "==" : "!="); // Outputs "a == b" on GCC
在编译时获取字符串的长度:

const char c[] = "Hello world.";
printf("Length of c: %d\n", sizeof(c) - 1); // Outputs 12 on GCC
尽管似乎没有办法将两者结合起来:

const char *d = "Hello world.";
printf("Length of d: %d\n", sizeof(d)); // Outputs the size of the pointer type; 8 on 64-bit computers

const char e[] = "Hello world.";
const char f[] = "Hello world.";
printf("e %s f\n", e == f ? "==" : "!="); // Outputs "e != f" on GCC

const char *g[] = {"Hello world."};
const char *h[] = {"Hello world."};
printf("g %s h\n", g == h ? "==" : "!="); // Outputs "g != h"
printf("Length of g: %d\n", sizeof(g[0])); // Outputs pointer type size

有没有我不知道的方法可以做到这一点?

gcc可能能够优化strlen()调用,以在编译时获得长度。
检查此处的
-fooptimize strlen
选项

您为什么有这些需求?您真正想做的是什么?@Eric Postspichil我正在编写一个库,其中可能有重复字符串,这些字符串位于标记为“static const char”的文件中。我更喜欢使用编译时生成的字符串长度,这样,如果有一个长度为1000个字符的字符串,您就不必等待使用strlen()进行1000个字符的搜索,因为您只需要为该字符串的长度设置一个常量值。我也不希望有重复的字符串,因为它们是多余的,但我更希望没有一个专门用于存储每个类的每个字符串的文件。只需编写一个单独的程序,根据需要组织字符串及其大小,并编写一个定义字符串的
.c
文件和一个导出声明的
.h
文件。C编译器并不打算做很多编译时的数据准备工作,当人们可以很容易地编写一个特殊用途的程序来完成所需的工作时,也没有什么理由试图强迫它这样做。这是否回答了你的问题?此外,您可以考虑<代码> const char * const d =“hello,Word”;
,如果您想使编译器更容易常数折叠strlen(d)
。是否有关于这对编译代码实际做了什么的信息?如果不是的话,我会在早上看一看,但它说它使用了函数的“更快的替代品”,这让我相信它们只是使用了不同的函数。此外,“max tracked strlens”选项表示它设置了最大“strlen优化过程[es][that]将跟踪字符串长度”,这似乎是存储长度的替代函数。如果它相当于一个编译时常量,这就是解决方案。没有找到任何官方信息,但这表明对strlen()的调用被替换为一个具有常量长度的汇编mov操作,我想这也可能取决于编译器的版本,因此,您应该检查它为您生成的程序集。在我所做的测试中,这在GCC中似乎运行良好。唯一的问题是它强制您包括string.h,即使没有调用strlen()。这对我的使用来说不是个问题,但对于那些研究它的人来说可能需要注意一些事情。这篇博文很有描述性,值得一读。