C: 宏产生警告 "statement with no effect"
C: macro produced warning "statement with no effect"
我在 C 中有以下代码:
int do_something(void);
#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() 0
#endif
此代码在未定义 SOMETHING 的情况下编译时产生警告 "statement with no effect"。我正在尝试修复它,但存在一个问题 - 使用此宏的代码有时会检查 "return value" 有时会忽略它。因此,我无法使用最简单的解决方案 - 在宏本身中转换为 void。
是否可以编写允许比较 "returned value" 并且在被忽略时不产生此警告的宏?
我使用 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
}
您还可以 ignore the warning 使用 #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.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!!!
我在 C 中有以下代码:
int do_something(void);
#ifdef SOMETHING
#define DO_SOMETHING() do_something()
#else
#define DO_SOMETHING() 0
#endif
此代码在未定义 SOMETHING 的情况下编译时产生警告 "statement with no effect"。我正在尝试修复它,但存在一个问题 - 使用此宏的代码有时会检查 "return value" 有时会忽略它。因此,我无法使用最简单的解决方案 - 在宏本身中转换为 void。
是否可以编写允许比较 "returned value" 并且在被忽略时不产生此警告的宏?
我使用 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
}
您还可以 ignore the warning 使用 #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.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!!!