是否可以使用一个预处理器&x27;输入到C中的另一个预处理器?
我正在尝试做这样的事情是否可以使用一个预处理器&x27;输入到C中的另一个预处理器?,c,macros,c-preprocessor,C,Macros,C Preprocessor,我正在尝试做这样的事情 #define INPUT (x = 3, y = 5) #define MATH(add) ((add == 1) ? (INPUT.x + INPUT.y) : (INPUT.x - INPUT.y)) void main (void) { int add = MATH (1); int subs = MATH (0); } 基本上我想简化这个 #define x 3 #define y 5 #define MATH(add) ((add == 1) ? (x +
#define INPUT (x = 3, y = 5)
#define MATH(add) ((add == 1) ? (INPUT.x + INPUT.y) : (INPUT.x - INPUT.y))
void main (void)
{
int add = MATH (1);
int subs = MATH (0);
}
基本上我想简化这个
#define x 3
#define y 5
#define MATH(add) ((add == 1) ? (x + y) : (x - y))
void main (void)
{
int add = MATH (1);
int subs = MATH (0);
}
这在C中可能吗?既然你非常想服用cpp药物,下面是一些值得思考的问题:
#include <stdio.h>
#define x 3
#define y 5
#define x1 +
#define x0 -
#define MATH(a) x x##a y
int main(void) {
int add = MATH(1);
int subs = MATH(0);
printf("add=%d, sub=%d\n", add, subs);
return 0;
}
#包括
#定义x3
#定义y5
#定义x1+
#定义x0-
#定义数学(a)x x#a#y
内部主(空){
int add=数学(1);
int subs=数学(0);
printf(“add=%d,sub=%d\n”,add,subs);
返回0;
}
既然你非常想服用cpp药物,下面是一些值得思考的问题:
#include <stdio.h>
#define x 3
#define y 5
#define x1 +
#define x0 -
#define MATH(a) x x##a y
int main(void) {
int add = MATH(1);
int subs = MATH(0);
printf("add=%d, sub=%d\n", add, subs);
return 0;
}
#包括
#定义x3
#定义y5
#定义x1+
#定义x0-
#定义数学(a)x x#a#y
内部主(空){
int add=数学(1);
int subs=数学(0);
printf(“add=%d,sub=%d\n”,add,subs);
返回0;
}
您希望实现什么目标?您可以选择使用-E
gcc检查预处理的代码。实际上,我正在为Avr Mcu编写代码。我的意思是,您能提供一个完整的示例吗?实际上,我不明白您想要什么(您有一些预处理的文件,您想用其他编译器再次预处理它?)您想如何“简化”的示例事情比你开始时要复杂得多。你到底想做什么?为什么要使用宏呢?只需intadd=3+5代码><代码>int subs=3-5代码>会更简单,我想。@Suprovo这并不能真正解释你想做什么!使用这些宏的目标是什么?(不要只说“做数学”。)你想达到什么目标?您可以选择使用-E
gcc检查预处理的代码。实际上,我正在为Avr Mcu编写代码。我的意思是,您能提供一个完整的示例吗?实际上,我不明白您想要什么(您有一些预处理的文件,您想用其他编译器再次预处理它?)您想如何“简化”的示例事情比你开始时要复杂得多。你到底想做什么?为什么要使用宏呢?只需intadd=3+5代码><代码>int subs=3-5代码>会更简单,我想。@Suprovo这并不能真正解释你想做什么!使用这些宏的目标是什么?(不要只是说“做数学”。)先生,事实上我知道这个过程。。。我正是在我的问题中寻找我提到的想象过程。。。因为我试图在“WinAVR”中简单地定义我的“AVR MCU”端口和引脚,就像在“CVAVR”中一样简单。我不想使用太多的“#define”,因为它看起来很笨重&内存有限。@Suprovo:您可能想为我们这些没有线索的人写一篇关于AVR MCU的更详细的解释。。。请注意,宏不使用目标系统中的任何内存。@Suprovo您应该避免将预处理器逻辑用于程序逻辑,因为这将导致重复的代码(指令),从而导致程序膨胀。最好使用更多的#定义不产生任何此类惩罚的
常量值。请注意,如果不使用定义,则定义不会消耗内存,如果使用简单表达式,则常数折叠将为您提供最优化的代码(使用优化编译,如-Os
),用于对GPIO、计时器等硬件寄存器进行编码访问。先生,实际上我知道这个过程。。。我正是在我的问题中寻找我提到的想象过程。。。因为我试图在“WinAVR”中简单地定义我的“AVR MCU”端口和引脚,就像在“CVAVR”中一样简单。我不想使用太多的“#define”,因为它看起来很笨重&内存有限。@Suprovo:您可能想为我们这些没有线索的人写一篇关于AVR MCU的更详细的解释。。。请注意,宏不使用目标系统中的任何内存。@Suprovo您应该避免将预处理器逻辑用于程序逻辑,因为这将导致重复的代码(指令),从而导致程序膨胀。最好使用更多的#定义不产生任何此类惩罚的
常量值。请注意,如果未使用定义,则定义不会消耗内存,如果使用简单表达式,则常数折叠将为您提供最优化的代码(使用优化编译,如-Os
),用于对GPIO、计时器等硬件寄存器进行编码访问。