宏作为C中宏的参数
我想知道在下面的代码中,哪个宏首先被替换宏作为C中宏的参数,c,macros,C,Macros,我想知道在下面的代码中,哪个宏首先被替换 #define A 100 #define B 200 #define C(A,B) A+B 在这里,当我们使用C时,计算将是从左到右或从右到左。即B首先获取值,或A首先获取值 我举这个例子只是为了让事情看起来简单,可能是我错了。我想问的实际问题是,如果A和B也有参数,并且有扩展的范围,那么哪一个会首先扩展,我不确定你的意思。从来没有一点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后交给编译器 我认为宏参数的名称永远不会被替换,就像它们是
#define A 100
#define B 200
#define C(A,B) A+B
在这里,当我们使用C时,计算将是从左到右或从右到左。即B首先获取值,或A首先获取值
我举这个例子只是为了让事情看起来简单,可能是我错了。我想问的实际问题是,如果A和B也有参数,并且有扩展的范围,那么哪一个会首先扩展,我不确定你的意思。从来没有一点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后交给编译器 我认为宏参数的名称永远不会被替换,就像它们是独立的符号一样 我试过了,这个程序:
#include <stdio.h>
#define A 100
#define B 200
#define C(A, B) A + B
int main(void) {
printf("A=%d\nB=%d\nC(1,2)=%d\n", A, B, C(1,2));
return 0;
}
因此,
C(1,2)
扩展到了1+2
,A
和B
的定义并不重要
当然,我必须说,我发现上述做法非常糟糕,因为它相当令人困惑。永远不要对宏参数使用所有大写名称,因为宏和预处理器符号往往使用这样的名称。我不知道你的意思。从来没有一点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后交给编译器 我认为宏参数的名称永远不会被替换,就像它们是独立的符号一样 我试过了,这个程序:
#include <stdio.h>
#define A 100
#define B 200
#define C(A, B) A + B
int main(void) {
printf("A=%d\nB=%d\nC(1,2)=%d\n", A, B, C(1,2));
return 0;
}
因此,
C(1,2)
扩展到了1+2
,A
和B
的定义并不重要
当然,我必须说,我发现上述做法非常糟糕,因为它相当令人困惑。永远不要对宏参数使用所有大写名称,因为宏和预处理器符号往往使用这样的名称。我不知道你的意思。从来没有一点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后交给编译器 我认为宏参数的名称永远不会被替换,就像它们是独立的符号一样 我试过了,这个程序:
#include <stdio.h>
#define A 100
#define B 200
#define C(A, B) A + B
int main(void) {
printf("A=%d\nB=%d\nC(1,2)=%d\n", A, B, C(1,2));
return 0;
}
因此,
C(1,2)
扩展到了1+2
,A
和B
的定义并不重要
当然,我必须说,我发现上述做法非常糟糕,因为它相当令人困惑。永远不要对宏参数使用所有大写名称,因为宏和预处理器符号往往使用这样的名称。我不知道你的意思。从来没有一点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后交给编译器 我认为宏参数的名称永远不会被替换,就像它们是独立的符号一样 我试过了,这个程序:
#include <stdio.h>
#define A 100
#define B 200
#define C(A, B) A + B
int main(void) {
printf("A=%d\nB=%d\nC(1,2)=%d\n", A, B, C(1,2));
return 0;
}
因此,
C(1,2)
扩展到了1+2
,A
和B
的定义并不重要
当然,我必须说,我发现上述做法非常糟糕,因为它相当令人困惑。切勿对宏参数使用all caps名称,因为宏和预处理器符号往往会使用此类名称。仅对简单的事情使用宏-对更复杂的事情使用编译器。它有一个类型安全。尽量避免宏我不是唯一一个认为A和B宏都不相关的人。(并不是说我在预处理器的世界里生死攸关,但仍然…)没有什么可以替代的,因为你不计算任何东西。@WhozCraig-你不是像宏
C
这样的函数中唯一的a
和B
都是宏参数。它们与A
和B
的定义没有任何关系。只需对简单的事情使用宏,对更复杂的事情使用编译器。它有一个类型安全。尽量避免宏我不是唯一一个认为A和B宏都不相关的人。(并不是说我在预处理器的世界里生死攸关,但仍然…)没有什么可以替代的,因为你不计算任何东西。@WhozCraig-你不是像宏C
这样的函数中唯一的a
和B
都是宏参数。它们与A
和B
的定义没有任何关系。只需对简单的事情使用宏,对更复杂的事情使用编译器。它有一个类型安全。尽量避免宏我不是唯一一个认为A和B宏都不相关的人。(并不是说我在预处理器的世界里生死攸关,但仍然…)没有什么可以替代的,因为你不计算任何东西。@WhozCraig-你不是像宏C
这样的函数中唯一的a
和B
都是宏参数。它们与A
和B
的定义没有任何关系。只需对简单的事情使用宏,对更复杂的事情使用编译器。它有一个类型安全。尽量避免宏我不是唯一一个认为A和B宏都不相关的人。(并不是说我在预处理器的世界里生死攸关,但仍然…)没有什么可以替代的,因为你不计算任何东西。@WhozCraig-你不是像宏C
这样的函数中唯一的a
和B
都是宏参数。它们与A
和B
的定义没有任何关系。+1这篇文章的最后一段应该一直教授,直到从打破的睡眠中背诵出来。我不认为这是“糟糕”的做法,或者说比任何函数或宏参数命名为另一个符号更糟糕。我举这个例子只是为了让事情看起来简单,可能是我错了。我想问的实际问题是,如果A和B也接受参数,并且有扩展的范围,那么哪个会扩展first@kharevbv我想你也许应该发布一个新的问题,它确实包含了你想要的