【问题标题】:how to use logical OR operation between macro and global variable如何在宏和全局变量之间使用逻辑或运算
【发布时间】:2021-08-08 10:37:01
【问题描述】:

input.c 和 output.h 两个文件,位于不同的位置,在激活宏“HEXA”时会打印出 output.c 中的数据。

考虑宏“HEXA”被禁用,当我在 input.c 中调用“active_fun”函数时,我想打印 output.h 文件中的数据。所以我使用了一个全局变量,它的值在调用函数“active_fun”时更新,并且在 .h 文件中使用全局变量来打印数据,如下所示

input.c -->

int var=0;                                       
int active_fun (void)                                
{                                                    
  var =1;                                       
}

输出.h --->

#ifdef HEXA|| (var ==1)
   printf("var value is one");
#endif

(我也使用过#ifdef HEXA || defined(var ==1) 即使这个逻辑也没有用)

我想在激活宏“HEXA”和通过 active_fun(禁用宏“HEXA”时)打印 .h 文件中的数据。

有没有其他方法可以打印 .h 文件中的数据。

【问题讨论】:

  • 您可以使用if ( HEXA || (var ==1) { printf("var value is one"); } [但在这种情况下您需要将 HEXA #定义为零]
  • “打印.h文件中的数据”这句话看不懂。通常头文件应该只包含声明、宏定义等,并且不应该包含实际执行类似printf的代码。

标签: c embedded logic automotive


【解决方案1】:

IMO 你应该更喜欢直接和可读:

int should_print = var;
#ifdef HEXA
should_print = 1;
#endif
if (should_print)
{
    printf("var value is one");
}

或者:

#ifndef HEXA
#define HEXA 0
#endif

if (HEXA || var)
{
    printf("var value is one");
}

注意:我还简化了您的 var 检查,假设它永远只会是 0 或 1。

【讨论】:

  • 这些与原始代码不同。如果var 不是 0 或 1,则会打印这些值,但原始代码(如预期)不会。
  • @Eric 是的,我应该注意到我故意进行了更改,因为原始代码仅显示 0 和 1 作为可能的值。在我看来,它更有可能是一个布尔值。如果var == 1 确实是必要的,那么这是一个微不足道的调整。
  • IMO,不能使用另一个宏,因为它的值将在编译中被替换,我想打印,当我调用“active_fun”时
  • 如果程序中还有#ifdef HEXA 块,第二种选择会导致问题。
  • @anu 我不明白。如果你想让active_fun在被调用时打印出来,为什么不能让它的body无条件地调用printf呢?我也不明白“不能使用另一个宏,因为它的值将在编译中被替换”是什么意思。
【解决方案2】:

你可以这样做:

/*
 * If x can be expanded then the expanded version will be stringified
 * unlike regular #x
 */
#define PPSTRFY(x) #x
#define IS_MACRO_DEFINED(m) strcmp(#m, PPSTRFY(m))

/* --- */

if (IS_MACRO_DEFINED(HEXA) || var == 1)
    printf("var value is one");

只有#define HEXA HEXA 才行不通,但我不明白你为什么要这样做。如果你不包括string.h,我认为用(#x != PPSTRFY(x))替换strcmp(#x, PPSTRFY(x))应该是一样的,因为相同的字符串文字应该有相同的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多