C-char与char中的#定义差异*
想问一下以下两者之间的区别:C-char与char中的#定义差异*,c,macros,c-preprocessor,C,Macros,C Preprocessor,想问一下以下两者之间的区别: #define STR 'a' 及 我认为区别在于第一个是作为单个char传递的,第二个是作为char*传递的,是一个两字符数组,如:['a','\0']你刚刚把宏的全部观点搞错了。宏是无类型的。它们不是数据类型。它们只是文本。只发短信 例如 这将首先进行预处理并生成以下代码: printf("%c\n", 'a'); #define X WobbleWobbleJobbleTheDobble__ printf("%d\n"
#define STR 'a'
及
我认为区别在于第一个是作为单个
char
传递的,第二个是作为char*
传递的,是一个两字符数组,如:['a','\0']
你刚刚把宏的全部观点搞错了。宏是无类型的。它们不是数据类型。它们只是文本。只发短信
例如
这将首先进行预处理并生成以下代码:
printf("%c\n", 'a');
#define X WobbleWobbleJobbleTheDobble__
printf("%d\n", X);
然后,将编译此代码并获得程序集
如果您有此代码:
printf("%c\n", 'a');
#define X WobbleWobbleJobbleTheDobble__
printf("%d\n", X);
然后预处理器将产生以下结果:
printf("%d\n", WobbleWobbleJobbleTheDobble__);
显然,编译会失败,但预处理器不在乎。macors所做的就是替换文本
#define X "a"
预处理器将在整个代码中查找标识符X
,并将其替换为“a”
。宏只是文本
顺便说一句,是的,你在最后一段中的想法适用于以下情况:
void *ch = "a";
ch
实际上有一个类型,不像宏那样是文本。宏不是对象。它们在被替换之前没有任何意义
在C中,“a”是一种类型int
,而中“a”是一种类型char[N]
(在这种情况下,N=2)。但还有更多。首先,将多个连续的字符串文字连接成一个文字。例如,下面的代码段:
如您所见,STR
宏的内容只是最终结果的一部分。输出中没有“a”
数组,生成的文本不是2个字符的数组。不能像那样连接字符常量
另一件事是,字符和字符串文本都可以有前缀,如L
,U
,U
,u8
。。。因此,替换后的结果文本可能是完全不同的类型
#define CONCAT2(str) L##str
#define CONCAT(str) CONCAT2(str)
#define STR_S "a"
#define STR_C 'a'
int main() {
wchar_t c = STR_C;
printf("wstring: %ls, wchar_t: %lc\n", CONCAT(STR_S), CONCAT(STR_C));
}
因此,上述代码中根本没有char[N]
,只有wchar\u[N]
。请参见两个宏定义实际上都不正确,因为您没有为宏指定任何名称。预处理器是一种相对简单的搜索-替换类型的东西,只处理文本。没有区别,因为它们都是无效的。\define
对C类型一无所知。这是一个文本替换工具。如果您想知道'a'
和“a”
之间的区别,那么是的,一个是字符,另一个是2字符数组,但是#define
不在乎。它们都不是字符*
'a'
是一个字符
,“a”
是一个字符[2]
。尽管在大多数表达式中使用了“a”
,但它将被指向其第一个元素的字符*
所取代。任何初学者学习材料都会解决'a'
和“a”
之间的差异。在这种情况下,它们位于#define
后面是不相关的。Re“它们只是文本。简单文本。”:宏替换在预处理器标记上工作,而不是简单文本。@EricPostSchil是的。但所谓“简单”,我的意思是,文本一般都是简单的。我不是指简单的文本,而是“简单”描述了全世界所有文本的质量。我的意思是,与数据类型相比,文本很简单。不管怎样,我会把它清理干净的。
#define CONCAT2(str) L##str
#define CONCAT(str) CONCAT2(str)
#define STR_S "a"
#define STR_C 'a'
int main() {
wchar_t c = STR_C;
printf("wstring: %ls, wchar_t: %lc\n", CONCAT(STR_S), CONCAT(STR_C));
}