Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
C字符串文本链接_C_String_Linker - Fatal编程技术网

C字符串文本链接

C字符串文本链接,c,string,linker,C,String,Linker,据我所知,链接器尝试将两个字符串文字合并为一个文字,如果它们都相同,例如: 文件1.c char const* firstString = "foo"; 文件2.c char const* secondString = "foo"; 将导致在相应的内存段中仅出现一次foo\0,从而节省4个字节。这对于嵌入式应用程序尤其重要,avr gcc与gcc的行为如何 但我想知道,如果两个字符串相等,那么它们的指针也相等,如果在整个程序中,您只传递字符串文本,而不存在运行时生成的字符串,那么我是否真的可

据我所知,链接器尝试将两个字符串文字合并为一个文字,如果它们都相同,例如:

文件1.c

char const* firstString = "foo";
文件2.c

char const* secondString = "foo";
将导致在相应的内存段中仅出现一次foo\0,从而节省4个字节。这对于嵌入式应用程序尤其重要,avr gcc与gcc的行为如何

但我想知道,如果两个字符串相等,那么它们的指针也相等,如果在整个程序中,您只传递字符串文本,而不存在运行时生成的字符串,那么我是否真的可以指望会发生这种情况,并相信这一点?在我的例子中,这是一个合理的假设。显然,我想加快与此的比较速度,并允许一个常用函数接收字符串文字,如下所示:

void lock(char const*);
void unlock(char const*);

lock("test");
dosmth();
unlock("test");
本质上,我希望避免在锁定/解锁函数中有一个巨大的枚举和巨大的开关。

实际上它们不能指向同一个内存,因为您可以对它们进行写入

现在,如果你说:

char *s1 = "MyString";
char *s2 = "MyString";
那么实际上,s1==s2是可能的。不要认为它是有保证的。

实际上它们不能指向相同的内存,因为您可以向它们写入

现在,如果你说:

char *s1 = "MyString";
char *s2 = "MyString";

那么实际上,s1==s2是可能的。不要认为它是有保证的。

我可能不会指望它,因为它依赖于编译器如何像这样解析符号。大多数编译器创建常量字符串的一个实例,然后简单地引用它,但我不依赖于此,因为在某些情况下,这不起作用。就我个人而言,我不会在锁和解锁方法中使用这样的字符串。枚举可能会更好地为您服务。

我可能不会指望它,因为它取决于编译器如何像这样解析符号。大多数编译器创建常量字符串的一个实例,然后简单地引用它,但我不依赖于此,因为在某些情况下,这不起作用。就我个人而言,我不会在锁和解锁方法中使用这样的字符串。枚举可能会更好地为您服务。

链接器不必合并任何内容。它只需要将声明的类型映射到定义的类型。这涉及到找到定义的类型并填写地址偏移量以跳转到正确的项


你所说的将是一个优化链接器。许多链接器根本不进行优化,而那些进行优化的链接器也不符合优化标准,因此,在那时,您将永远无法对您在该机器上发现的链接器的观察结果进行概括。

链接器不必合并任何内容。它只需要将声明的类型映射到定义的类型。这涉及到找到定义的类型并填写地址偏移量以跳转到正确的项


你所说的将是一个优化链接器。许多链接器根本不进行优化,而那些进行优化的链接器也不符合优化标准,因此,对于当时在那台机器上发现的链接器,你永远无法概括出超出观察到的结果。

我认为你走错了方向。链接器不仅不会合并来自不同编译单元的字符串文本,而且很可能根本不会为它们创建外部符号

即使在同一编译单元内,编译器也可以将同一字符串文字的两个匹配项合并为一个,但它没有义务这样做:

未指定这些数组是否不同,前提是它们的 元素具有适当的值

现在来看看真正的问题,这似乎是你问题的根源。在C语言中,基于字符串文本执行锁定/解锁对可能不是一个好主意。正如您所说的,这会导致代码中使用开关或类似的东西膨胀


更自然的做法是使用锁类型,并为每个独特的锁定/解锁事件声明一个具有可区分名称的全局变量。这迫使您以在所有编译单元中都可见的方式声明每个此类事件,并从实际定义的编译单元中选择一个。

我认为您走错了方向。链接器不仅不会合并来自不同编译单元的字符串文本,而且很可能根本不会为它们创建外部符号

即使在同一编译单元内,编译器也可以将同一字符串文字的两个匹配项合并为一个,但它没有义务这样做:

未指定这些数组是否不同,前提是它们的 元素具有适当的值

现在来看看真正的问题,这似乎是你问题的根源。在C语言中,基于字符串文本执行锁定/解锁对可能不是一个好主意。正如您所说的,这会导致代码中使用开关或类似的东西膨胀

更自然的做法是使用锁类型,并为每个独特的锁定/解锁事件声明一个具有可区分名称的全局变量。这迫使您声明每个
这样的事件在您所有的编译单元中都是可见的,并在您实际定义它的地方选择一个编译单元。

C标准没有提供这样的保证注:我修改了这个问题,以反映所有字符串都是不可变的。使用字符串来实现这一目的是不可能的。@R..:这是一个非常简单的示例,只要想想是否能做到。但是也许您可以详细说明您的陈述。C标准没有提供这样的保证注:我修改了这个问题,以反映所有字符串都是不可变的。使用字符串来实现此目的是不可能的。@R..:这是一个非常简单的示例,只是考虑一下是否可以做到这一点。但也许您可以详细说明一下您的语句。它们应该是常量字符串,不是吗甚至我把它们放在一个char[]变量中;文本本身是const.Nope only char*str=。。。是恒定的。当你进行初始化时,字符串是可变的。如果我想一想,你是对的,它应该是const char*或const char[],应该是第一个。第二个始终是可变内存,因为它显式保留内存。它们应该是常量字符串,不是吗?-甚至我把它们放在一个char[]变量中;文本本身是const.Nope only char*str=。。。是恒定的。当你进行初始化时,字符串是可变的。如果我想一想,你是对的,它应该是const char*或const char[],应该是第一个。第二个始终是可变内存,因为它显式地保留内存。