在定义字符串大小C时使用#define
我是C的初学者,我想问一下下面提到的两种不同代码中内存分配过程的差异:在定义字符串大小C时使用#define,c,string,c-preprocessor,C,String,C Preprocessor,我是C的初学者,我想问一下下面提到的两种不同代码中内存分配过程的差异: #define MAX_LEN 10000 int main() { char str_new[MAX_LEN]; ... } int main() { char str_new[10000]; ... } 这两者本质上不一样吗?? 在这两种情况下,内存分配方式是否相同? 这在我搜索的问题中没有得到回答。虽然两种不同的方法经常使用。但它们都是等效的。在第一个程序中,宏MAX_LEN通过简单的文本替换替换为10000。它
#define MAX_LEN 10000
int main()
{
char str_new[MAX_LEN];
...
}
int main()
{
char str_new[10000];
...
}
这两者本质上不一样吗??
在这两种情况下,内存分配方式是否相同?
这在我搜索的问题中没有得到回答。虽然两种不同的方法经常使用。但它们都是等效的。在第一个程序中,宏
MAX_LEN
通过简单的文本替换替换为10000
。它们都是等效的。在第一个程序中,宏MAX_LEN
通过简单的文本替换替换为10000
。是的,上述两种方法将为stru new分配相同的内存量
这是因为静态内存分配是在编译时完成的,而as预处理器指令是在预处理时解析的。是的,上述两种方法将为stru new分配相同数量的内存
这是因为静态内存分配是在编译时完成的,而as预处理器指令是在预处理时解析的。在计算机看来,它们总是一样的 然而,如果你有
char str_new_o1[10000];
char str_new_02[10000];
char str_new_03[10000];
char str_new_04[10000];
char str_new_05[10000];
...
char str_new_100[10000];
甚至可能它们在不同的文件夹中
所有数组的大小都应该相同(因为它们具有相同的含义)。嗯,他们现在是
但是,有一天,你发现你需要改变数组的大小,你现在需要2000个,所以你需要改变所有的数组,一个忘记,很多错误。
现在,我们称1000为一个幻数
然而,如果你把1000定义为一个马可,你只需要改变一次,没有什么需要担心的
因此,在我们看来,它们是不同的,如果您只有一个数组,请直接使用数字,因为不必要的marco是邪恶的,而如果您有许多相同大小的数组,请在代码中使用marco来避免魔法数字,它们是相同的。在计算机看来,它们总是一样的 然而,如果你有
char str_new_o1[10000];
char str_new_02[10000];
char str_new_03[10000];
char str_new_04[10000];
char str_new_05[10000];
...
char str_new_100[10000];
甚至可能它们在不同的文件夹中
所有数组的大小都应该相同(因为它们具有相同的含义)。嗯,他们现在是
但是,有一天,你发现你需要改变数组的大小,你现在需要2000个,所以你需要改变所有的数组,一个忘记,很多错误。
现在,我们称1000为一个幻数
然而,如果你把1000定义为一个马可,你只需要改变一次,没有什么需要担心的
因此,在我们看来,它们是不同的,如果你只有一个数组,直接使用数字,因为不必要的marco是邪恶的,而如果你有很多相同大小的数组,在编译过程中使用marco来避免魔法数字,主函数中的
MAX_LEN
将被\define MAX_LEN
值替换,即10000。此外,应替换所有的MAX_LEN
。我认为编译后的符号列表中将不再存在\define MAX\u LEN
,在编译过程中,主函数中的MAX\u LEN
将被\define MAX\u LEN
值替换,即10000。此外,应替换所有的MAX_LEN
。我认为编译后,#define MAX_LEN
将不再存在于符号列表中它们都是相同的。
根据标准:
6.10.3/9宏替换
表单的预处理指令
#define identifier replacement-list new-line
定义一个类似对象的宏,该宏使宏名称的每个后续实例被构成指令剩余部分的预处理标记替换列表替换
这意味着在预处理步骤中,编译器将用其值替换所有出现的MAX\u LEN
。因此:
#define MAX_LEN 10000
char str_new[MAX_LEN];
简单地翻译为:
char str_new[10000];
它们都是一样的。 根据标准: 6.10.3/9宏替换 表单的预处理指令
#define identifier replacement-list new-line
定义一个类似对象的宏,该宏使宏名称的每个后续实例被构成指令剩余部分的预处理标记替换列表替换
这意味着在预处理步骤中,编译器将用其值替换所有出现的MAX\u LEN
。因此:
#define MAX_LEN 10000
char str_new[MAX_LEN];
简单地翻译为:
char str_new[10000];
您需要了解编译的不同阶段。试着阅读一些关于预处理器的内容。是的,它们是一样的——在实际编译之前执行直接字符替换,所以最终编译的是相同的字符。要注意的是编码
#定义最大长度=10000
或#定义最大长度10000代码>,因为其中包含不希望替换的字符。此外,如果包含表达式,请用()
将其包围。例如,如果您编码#定义MY_CONST 5+10
,然后int x=MY_CONST*3代码>,您将得到intx=5+10*3代码>和结果为35而不是45。因此,code#定义MY_CONST(5+10)
。您需要了解编译的不同阶段。试着阅读一些关于预处理器的内容。是的,它们是一样的——在实际编译之前执行直接字符替换,所以最终编译的是相同的字符。要注意的是编码#定义最大长度=10000
或#定义最大长度10000代码>,因为其中包含不希望替换的字符。此外,如果包含表达式,请用()
将其包围。例如,如果您编码#定义MY_CONST 5+10
,然后int x=MY_CONST*3代码>,您将获得intx