Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
宏作为C中宏的参数_C_Macros - Fatal编程技术网

宏作为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我想你也许应该发布一个新的问题,它确实包含了你想要的