Reputation: 7482
For instance:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
In C++ I was able to put a /*...*/
comment around the parameters. But not in C, of course, where it gives me the error:
error: parameter name omitted
Upvotes: 283
Views: 310414
Reputation: 31
For compilers that complain about the accepted answer, the following alternative should work.
#define UNUSED(x) if (&(x) == 0) {}
Another alternative could be:
#define UNUSED(x) switch((long long)&(x)) { default: break; }
Upvotes: 0
Reputation: 28751
See individual answers for __attribute__((unused))
, various #pragma
s and so on. Optionally, wrap a preprocesor macro around it for portability.
IDEs can signal unused variables visually (different color, or underline). Having that, compiler warning may be rather useless.
In GCC and Clang, add -Wno-unused-parameter
option at the end of the command line (after all options that switch unused parameter warning on, like -Wall
, -Wextra
).
void foo(int bar) {
(void)bar;
}
As per jamesdlin's answer and Mailbag: Shutting up compiler warnings.
Not allowed in C before the C23 standard, but with a latest compiler (in 2023) and in C++ (since like forever) one can do
void foo(int /*bar*/) {
...
}
See the N2480 Allowing unnamed parameters in a function definition (pdf) proposal, and check the implementation status at https://en.cppreference.com/w/c/compiler_support.
GCC 11, Clang 11, and ICX 2022.2 (oneAPI 2022.3) support this.
In C++17, there is the [[maybe_unused]]
attribute which has become part of the standard. Before that, there was [[gnu::unused]]
. See clang docs for additional overview. (The gnu::
attributes in general work in clang as well.)
As part of the C standardization effort bringing closer together C and C++ features, in C23 we get new attributes in the C language. One of them is [[maybe_unused]]
which works the same as the C++ version. The [[gnu::unused]]
compiler-specific attribute is not available in versions prior to C23, because earlier C language versions did not have these attributes at all.
Upvotes: 7
Reputation: 1
when using the main function in c program and not using the main arguments you can void the arguments as below;
#include <stdio.h>
int main(int argc, char **argv)
{
(void)**argv;
printf("The program has %d arguments\n`enter code here`",argc);
return (0);
}
Upvotes: -1
Reputation: 9125
In GCC, you can label the parameter with the unused
attribute.
This attribute, attached to a variable, means that the variable is meant to be possibly unused. GCC will not produce a warning for this variable.
In practice this is accomplished by putting __attribute__ ((unused))
just before the parameter. For example:
void foo(workerid_t workerId) { }
becomes
void foo(__attribute__((unused)) workerid_t workerId) { }
Upvotes: 162
Reputation: 47968
You can use GCC or Clang's unused attribute. However, I use these macros in a header to avoid having GCC specific attributes all over the source, also having __attribute__
everywhere is a bit verbose/ugly.
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
# define UNUSED(x) UNUSED_ ## x
#endif
#ifdef __GNUC__
# define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
# define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif
Then you can do...
void foo(int UNUSED(bar)) { ... }
I prefer this because you get an error if you try use bar
in the code anywhere, so you can't leave the attribute in by mistake.
And for functions...
static void UNUSED_FUNCTION(foo)(int bar) { ... }
Note 1):
As far as I know, MSVC doesn't have an equivalent to __attribute__((__unused__))
.
Note 2):
The UNUSED
macro won't work for arguments which contain parenthesis,
so if you have an argument like float (*coords)[3]
you can't do,
float UNUSED((*coords)[3])
or float (*UNUSED(coords))[3]
. This is the only downside to the UNUSED
macro I found so far, and in these cases I fall back to (void)coords;
.
Upvotes: 77
Reputation: 1013
With GCC with the unused attribute:
int foo (__attribute__((unused)) int bar) {
return 0;
}
Upvotes: 25
Reputation: 3408
For the record, I like Job's answer, but I'm curious about a solution just using the variable name by itself in a "do-nothing" statement:
void foo(int x) {
x; /* unused */
...
}
Sure, this has drawbacks; for instance, without the "unused" note it looks like a mistake rather than an intentional line of code.
The benefit is that no DEFINE is needed and it gets rid of the warning.
Upvotes: 0
Reputation: 5332
Since C++ 17, the [[maybe_unused]]
attribute can be used to suppress warnings about unused parameters.
Based on the OP's example code:
Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
return TRUE;
}
Upvotes: 16
Reputation: 1728
Seeing that this is marked as gcc you can use the command line switch Wno-unused-parameter
.
For example:
gcc -Wno-unused-parameter test.c
Of course this effects the whole file (and maybe project depending where you set the switch) but you don't have to change any code.
Upvotes: 37
Reputation: 1250
I've seen this style being used:
if (when || who || format || data || len);
Upvotes: 1
Reputation: 139
In MSVC to suppress a particular warning it is enough to specify the it's number to compiler as /wd#. My CMakeLists.txt contains such the block:
If (MSVC)
Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
Add_definitions (-Wall -W -pedantic)
Else ()
Message ("Unknown compiler")
Endif ()
Now I can not say what exactly /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127 mean, because I do not pay any attention to MSVC for three years, but they suppress superpedantic warnings that does not influence the result.
Upvotes: 1
Reputation: 1810
I got the same problem. I used a third-part library. When I compile this library, the compiler (gcc/clang) will complain about unused variables.
Like this
test.cpp:29:11: warning: variable 'magic' set but not used [-Wunused-but-set-variable] short magic[] = {
test.cpp:84:17: warning: unused variable 'before_write' [-Wunused-variable] int64_t before_write = Thread::currentTimeMillis();
So the solution is pretty clear. Adding -Wno-unused
as gcc/clang CFLAG will suppress all "unused" warnings, even thought you have -Wall
set.
In this way, you DO NOT NEED to change any code.
Upvotes: 8
Reputation: 361
A gcc/g++ specific way to suppress the unused parameter warning for a block of source code is to enclose it with the following pragma statements:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
Upvotes: 16
Reputation: 135
Labelling the attribute is ideal way. MACRO leads to sometime confusion. and by using void(x),we are adding an overhead in processing.
If not using input argument, use
void foo(int __attribute__((unused))key)
{
}
If not using the variable defined inside the function
void foo(int key)
{
int hash = 0;
int bkt __attribute__((unused)) = 0;
api_call(x, hash, bkt);
}
Now later using the hash variable for your logic but doesn’t need bkt. define bkt as unused, otherwise compiler says'bkt set bt not used".
NOTE: This is just to suppress the warning not for optimization.
Upvotes: 5
Reputation: 18316
I usually write a macro like this:
#define UNUSED(x) (void)(x)
You can use this macro for all your unused parameters. (Note that this works on any compiler.)
For example:
void f(int x) {
UNUSED(x);
...
}
Upvotes: 401