C 预处理库中的符号,并在使用库时更改符号值
我的C 预处理库中的符号,并在使用库时更改符号值,c,gcc,C,Gcc,我的Lib.h中有一个带有内联函数的库项目: static inline void DoStuff(void) __attribute__ ((always_inline)); static inline void DoStuff(void) { #if(SYMBOL == 1) // Stuff #elif(SYMBOL == 2) // Other stuff #endif } 我将我的库编译成libLib.a并设置SYMBOL=2。现在我在其他一些项
Lib.h
中有一个带有内联函数的库项目:
static inline void DoStuff(void) __attribute__ ((always_inline));
static inline void DoStuff(void)
{
#if(SYMBOL == 1)
// Stuff
#elif(SYMBOL == 2)
// Other stuff
#endif
}
我将我的库编译成
libLib.a
并设置SYMBOL=2
。现在我在其他一些项目中使用这个库和标题Lib.h
。此项目设置了SYMBOL=1
并在此项目中调用DoStuff()
。如果执行了指令,则执行指令的哪一部分?我假设编译器将使用#if(SYMBOL==1)
运行部件,但我不确定。编译器如何处理它?首先,预处理器指令的正确语法是:
static inline void DoStuff(void) __attribute__ ((always_inline));
static inline void DoStuff(void)
{
#if SYMBOL == 1
// Stuff
#elif SYMBOL == 2
// Other stuff
#endif
}
如果愿意,您也可以在比较的周围留下括号,但这并不像常规的if
条件那样严格必要
如果不确定哪些代码部分处于活动状态,可以使用#warning
使其变得明显:
#if SYMBOL == 1
#warning Symbol == 1
// Stuff
#elif SYMBOL == 2
#warning Symbol == 2
// Other stuff
#endif
在C语言中,以#开头的行由预处理器进行预处理,这意味着编译时,编译器将像这样读取它(例如,如果库中的SYMBOL=1:
static inline void DoStuff(void) __attribute__ ((always_inline));
static inline void DoStuff(void)
{
//only the stuff that were in the block of SYMBOL=1
}
当您将代码编译到库中时,它不再知道符号。
当您更改代码中的符号时,它只会更改此项目的符号。
要解决此问题,请使用标题中的宏:
在DoStuff.h中:
void __do_stuff1();
void __do_stuff2();
static inline void DoStuff()
{
#if SYMBOL==1
__do_stuff1();
#elif SYMBOL==2
__do_stuff2();
#endif
}
在DoStuff.c中:
void__do_stuff1(){...}
void __do_stuff2(){...}
将库转换为libLib.a并设置SYMBOL=2
-如何进行此操作?如何“设置”SYMBOL=2?显示代码。使用#error
编译将失败,因此#warning
是更好的选择。如果不支持,编译器也会抱怨它,因此它的效果几乎与#error
相同(如果不支持;)#warning
在我的情况下确实有效,所以我已经验证了我的假设。带括号的语法没有错,只是不需要它们。@thebusybee我没有声明,但其他部分是错的(否则,如果,endif缺失),对的,但这击中了我的眼睛。对不起,吵闹了。无论如何,您可能希望扩展您的答案。;-)