【问题标题】:Difference in #define in C - char vs char*C中#define的区别 - char vs char*
【发布时间】:2021-06-03 09:53:33
【问题描述】:

想问有什么区别:

#define STR 'a'

#define STR "a"

我认为不同之处在于第一个作为单个char 传递,第二个作为char* 传递并且是一个双字符数组,例如:['a','\0']

【问题讨论】:

  • 这两个宏定义实际上都不正确,因为您没有为宏命名。什么都没有通过,预处理器是一种相对简单的搜索替换类型的东西,只处理文本。
  • 没有区别,都是无效的。
  • #define 对 C 类型一无所知。这是一个文本替换工具。如果您想知道'a'"a" 之间的区别,那么是的,一个是一个字符,另一个是一个2 字符数组,但#define 不在乎。
  • 它们都不是char*'a'char"a"char[2]。尽管如果"a" 在大多数表达式中使用,它将被替换为指向其第一个元素的char*
  • 'a'"a" 之间的区别可以通过任何初学者学习材料来解决。在这种情况下,他们坐在#define 后面是无关紧要的。

标签: c macros c-preprocessor


【解决方案1】:

您刚刚理解了宏的全部意义错误。宏是无类型的。它们没有数据类型。它们只是文本。只是文字。

例如。

#define X 'a'
printf("%c\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 实际上有一个类型,而不是像宏那样的文本。

【讨论】:

  • 回复“它们只是文本。简单文本。”:宏替换适用于预处理器标记,而不是简单文本。
  • @EricPostpischil 实际上是的。但是“简单”是指一般的文本很简单。我的意思不是简单的文本,而是“简单”描述了全世界所有文本的品质。我的意思是与数据类型相比,文本很简单。反正我会清理的。
【解决方案2】:

宏不是对象。在被替换之前它们没有任何意义

在 C 中,'a'character constant,类型为 int"a"string literal,类型为 char[N](本例中 N = 2)。但远不止这些。首先,多个连续的字符串文字将被连接成一个文字。比如下面的 sn -p will print xyzabca:

#define STR "a"
const char str1[] = "xyz" STR "bc";
printf("%s" STR "\n", str1);

如您所见,STR 宏的内容只是最终结果的一部分。输出中没有 "a" 数组,并且生成的文字不是 2 字符数组。你不能像这样连接字符常量

另一件事是字符和字符串文字都可以有前缀,如LUuu8...所以替换后的结果文本可能是完全不同的类型

#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_t[N]。见demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2014-03-21
    • 2013-03-22
    • 2011-11-25
    相关资源
    最近更新 更多