C:宏生成警告“;“无效力声明”;

C:宏生成警告“;“无效力声明”;,c,gcc,macros,warnings,C,Gcc,Macros,Warnings,我有以下C代码: int do_something(void); #ifdef SOMETHING #define DO_SOMETHING() do_something() #else #define DO_SOMETHING() 0 #endif 这段代码在未定义任何内容的情况下编译时会生成警告“语句无效”。我试图修复它,但有一个问题-使用此宏的代码有时会检查“返回值”,有时会忽略它。正因为如此,我无法使用最简单的解决方案—在宏本身中进行无效转换 是否可以编写允许比较“返回值”且在忽略时

我有以下C代码:

int do_something(void);

#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() 0
#endif
这段代码在未定义任何内容的情况下编译时会生成警告“语句无效”。我试图修复它,但有一个问题-使用此宏的代码有时会检查“返回值”,有时会忽略它。正因为如此,我无法使用最简单的解决方案—在宏本身中进行无效转换

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


我使用gcc编译代码。

三种可能的解决方案:

定义一个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
}
您还可以使用
#pragma
指令

顺便问一下,您正在编译哪个版本的gcc以及使用哪些标志<代码>gcc-Wall-pedantic和gcc 4.9不会产生警告

#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时,将获得以下输出:

0 0
end!!!
do_something has been called 1 time!
do_something has been called 2 times!
do_something has been called 3 times!
2 3
end!!!
如果使用以下方法编译:

gcc main.c -o main
gcc main.c -DSOMETHING -o main
运行main时,将获得以下输出:

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

啊,我忘了我可以使用另一个总是返回零的函数。谢谢我使用GCC4.4.7,它使用-Wall或-Wunused值生成此警告这有一个问题-我必须修改我庞大的代码库。我需要一些可以在一个文件中应用的东西。我知道你想要使用/不使用返回值的函数!我认为您在代码中使用了宏DO_SOMETHING(),但是可以直接调用它(不指定结果)或指定它的返回值。如果这是一个问题,更好的方法可能是修改函数do#u something,如gjulianm所示。int do#u something(void){#ifndef something返回0;#else//Your implementation here}#end如果什么都不做的经典方法是
#define do#u something()((void)0)
。强制转换停止编译器抱怨“语句无效”。但是,如果您实际上有时使用结果(因为
do\u something()
返回一个
int
),那么这没有虚拟函数那么有用。另见。