在c语言中,宏uuu文件uuu、uuu行uuu&uu漂亮u函数uu_是否分配内存?

在c语言中,宏uuu文件uuu、uuu行uuu&uu漂亮u函数uu_是否分配内存?,c,multithreading,pointers,memory,macros,C,Multithreading,Pointers,Memory,Macros,让我们假设以下代码: char*c=\uuuuuu文件\uuuuuu 堆栈或堆上是否存在c?作为后续,我可以将c传递给另一个线程进行处理,还是需要将数据存储到其他地方 谢谢。宏由预处理器处理。因此,可能发生的情况是: char* c = __FILE__; 将由预处理器更改为: char* c = "ThisIsMyFilename.c"; 请注意,指针值保证永远指向该常量,因此您可以复制指针值或将其传递给另一个线程而不会出现问题。当然,不要试图修改它的内容 宏由预处理器处理。因此,可能发生

让我们假设以下代码:

char*c=\uuuuuu文件\uuuuuu

堆栈或堆上是否存在c?作为后续,我可以将c传递给另一个线程进行处理,还是需要将数据存储到其他地方


谢谢。

宏由预处理器处理。因此,可能发生的情况是:

char* c = __FILE__;
将由预处理器更改为:

char* c = "ThisIsMyFilename.c";

请注意,指针值保证永远指向该常量,因此您可以复制指针值或将其传递给另一个线程而不会出现问题。当然,不要试图修改它的内容

宏由预处理器处理。因此,可能发生的情况是:

char* c = __FILE__;
将由预处理器更改为:

char* c = "ThisIsMyFilename.c";
请注意,指针值保证永远指向该常量,因此您可以复制指针值或将其传递给另一个线程而不会出现问题。当然,不要试图修改它的内容

c是指针类型的变量,根据声明所在的范围,它以任何存储持续时间存在于任何位置。它是用字符串文本的地址初始化的,该字符串文本具有静态存储持续时间,不可修改,并且可以用相同的字符串折叠

如果将其更改为uu PRETTY_FUNCTION uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从根本上说,预处理器对函数边界没有任何概念。如果函数实际上是由宏逐段定义的,那么预处理器将扩展什么呢?因此,它是一个特殊的扩展,本质上是一个隐式声明的数组类型的静态局部变量,用一个包含漂亮函数名的字符串初始化。

c是一个指针类型的变量,它存在于任何地方,根据声明所在的范围以任何存储持续时间声明。它是用字符串文本的地址初始化的,该字符串文本具有静态存储持续时间,不可修改,并且可以用相同的字符串折叠

如果将其更改为uu PRETTY_FUNCTION uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。从根本上说,预处理器对函数边界没有任何概念。如果函数实际上是由宏逐段定义的,那么预处理器将扩展什么呢?因此,它是一个特殊的扩展名,本质上是一个隐式声明的数组类型的静态局部变量,用一个包含漂亮函数名的字符串初始化。

\uuuuuu文件\uuuuuuu扩展为字符串文本,作为所有字符串文本,它需要存储在可执行文件中。它存储为包含空终止符的只读字符数组。因此,在某种程度上,编译器为它分配内存

非标准符号uu PRETTY_函数uuu是一个特殊的局部变量,它是一个字符数组,与其他数组和字符串文字类似,它占用空间

__LINE__宏扩展为一个整数文本,它本身通常不占用空间

当然,变量本身也需要一些空间。

\uuuuu文件\uuuuuuu扩展为字符串文字,并且作为所有字符串文字,它需要存储在可执行文件中。它存储为包含空终止符的只读字符数组。因此,在某种程度上,编译器为它分配内存

非标准符号uu PRETTY_函数uuu是一个特殊的局部变量,它是一个字符数组,与其他数组和字符串文字类似,它占用空间

__LINE__宏扩展为一个整数文本,它本身通常不占用空间

当然,变量本身也需要一些空间。

\uuuuu FILE\uuuuuu是一个宏,它可以扩展为字符串文字,如foo.c

字符串文本存储在一些既不是堆栈也不是堆的全局存储中。只要程序在运行,它们就存在,因此您可以将指向它们的指针安全地传递给其他线程

__行是一个宏,它可以扩展为一个数字,如42。因为它只是一个int,所以可以安全地复制它

__PRETTY_FUNCTION_uuu是一个静态变量const char数组,隐式创建于函数范围。只要程序在运行,它就存在。

\uuuuu FILE\uuuuuu是一个宏,它可以扩展为字符串文字,如foo.c

字符串文本存储在一些既不是堆栈也不是堆的全局存储中。只要程序在运行,它们就存在,因此您可以将指向它们的指针安全地传递给其他线程

__行是一个宏,它可以扩展为一个数字,如42。因为它只是一个int,所以可以安全地复制它

__PRETTY_FUNCTION_uuu是一个静态变量const char数组,隐式创建于函数范围。只要程序在运行,它就存在。

\uuuu PRETTY\u函数不存在,而且根本无法扩展为字符串文字。它是数组类型ini的隐式声明局部变量
使用名称初始化。uuu PRETTY_uu函数uuuuu不能也根本不能扩展为字符串文字。这是一个隐式声明的数组类型的局部变量,用名称初始化。感谢您的回复。我的理解是,在您的示例中,thismyFileName.c位于某个只读内存中的位置,只要我有该内存位置的地址,我就可以访问数据,因此不需要复制。我想验证一下我是否理解正确,或者如果我不理解的话,这到底是如何工作的。谢谢你的回复,大卫。我的理解是,在您的示例中,thismyFileName.c位于某个只读内存中的位置,只要我有该内存位置的地址,我就可以访问数据,因此不需要复制。我想验证我是否理解正确,或者如果我不理解的话,这是如何实际工作的。这是一个具有局部作用域的静态数组。所以它的地址是持久的,它是一个具有本地作用域的静态数组。所以它的地址是持久的。