Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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_Gcc - Fatal编程技术网

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缺失),对的,但这击中了我的眼睛。对不起,吵闹了。无论如何,您可能希望扩展您的答案。;-)