C:宏观警告"声明没有效果"

时间:2015-04-10 15:24:22

标签: c gcc macros warnings

我在C中有以下代码:

int do_something(void);

#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() 0
#endif

在没有定义SOMETHING的情况下编译时,此代码生成警告“无效的语句”。我试图解决它,但有一个问题 - 使用此宏的代码有时会检查“返回值”,有时会忽略它。因此,我无法使用最简单的解决方案 - 在宏本身中转换为void。

是否可以编写允许比较“返回值”的宏,并且在忽略它时不会产生此警告?

我使用gcc编译我的代码。

2 个答案:

答案 0 :(得分:2)

三种可能的解决方案:

定义一个do_nothing函数,该函数将由gcc:

优化
int do_something(void);
int do_nothing(void) { return 0; } 

#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() do_nothing()
#endif

或者,修改do_something实现以移动#ifdef检查

int do_something(void)
{
  #ifndef SOMETHING
  return 0;
  #endif

// Your implementation here
}

您还可以ignore the warning使用#pragma指令。

顺便问一下,你编译的是哪个版本的gcc和哪个标志?带有GCC 4.9的gcc -Wall -pedantic不会产生警告。

答案 1 :(得分:0)

#include <stdio.h>

int do_something(void);

#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#define DO_SOMETHING_ASSIGN() do_something()
#else
#define DO_SOMETHING() 
#define DO_SOMETHING_ASSIGN() 0
#endif

int do_something(void)
{
    static int cnt=0;
    /* code for do something here */
    ++cnt;
    printf("do_something has been called %d %s!\n",cnt,
        (cnt==1)?"time":"times");   
    return cnt;
}

void main(void)
{
    int x;

    DO_SOMETHING();

    x=DO_SOMETHING_ASSIGN();    

    printf("%d %d\n",x,DO_SOMETHING_ASSIGN());

    puts("end!!!");
}

我希望这对你有用!

如果将此代码保存为main.c,则可以使用以下命令编译它:

gcc main.c -o main

当您运行main时,您将获得以下输出:

0 0
end!!!

如果你用以下代码编译它:

gcc main.c -DSOMETHING -o main

运行main时,您将获得以下输出:

do_something has been called 1 time!
do_something has been called 2 times!
do_something has been called 3 times!
2 3
end!!!