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));
}