在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
我正在阅读一本使用 C的书(Butenhof 的POSIX 线程编程,1997 年),我遇到了以下行:
(void)free(data);
Run Code Online (Sandbox Code Playgroud)
这里,data只是一个指向已分配结构的指针,
data = malloc(sizeof(my_struct_t));
Run Code Online (Sandbox Code Playgroud)
为什么是free被强制转换的结果void?
根据我对 C 的理解,这似乎没有意义,原因有两个:
void这本书写于 1997 年。这是某种遗产吗?
作者提到这些示例是在 Digital Unix 4.0d 上运行的,但如果您不打算使用该结果,我仍然无法想象有理由强制转换该函数的结果。
用它std::ignore来忽略未使用的变量是一种好方法吗?
假设我有这样的函数:
void func(int i)
{
//for some reason, I don't need i anymore but I cannot change signature of function
std::ignore = i;
}
Run Code Online (Sandbox Code Playgroud)
附加信息
这是一个例子,一些答案建议使用匿名变量.但是我如何为其他情况做这件事,比如:
int Thread_UnSafe_func_returnSomething():
void func()
{
// To make it thread safe
// Also it is required to call only once
static int i = Thread_UnSafe_func_returnSomething();
std::ignore = i;
}
Run Code Online (Sandbox Code Playgroud) 我必须找到最多由用户提供的三个号码,但有一些限制.不允许使用任何条件声明.我尝试使用下面的三元运算符.
max=(a>b?a:b)>c?(a>b?a:b):c
Run Code Online (Sandbox Code Playgroud)
但它再次限制使用三元运算符.现在我不知道该怎么做?
可能重复:
将未使用的返回值转换为void
(void)例如,在函数调用之前的目的是什么
(void)func1();
Run Code Online (Sandbox Code Playgroud)
我认为这和简单地调用一样 func1();
因此,(void)调用只是为了让其他程序员知道返回类型将被忽略,例如,如果func1()有返回类型int,或者编译器是否可能对函数执行某些优化?也许完全背后还有另一个原因 - 它甚至是合法的C++,还是在某些遗留代码中看到的C的残余.
谢谢
经常使用的语句(void)x;允许禁止有关未使用变量的警告x.但是如果我尝试编译以下内容,我会得到一些我不太了解的结果:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译它,我得到以下警告:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Run Code Online (Sandbox Code Playgroud)
因此,我得出结论,转换为void与任何其他类型的转换非常不同,是目标类型相同decltype(x)或不同的东西.我猜测可能的解释是:
(void)x;但其他演员不会抑制警告.所有陈述同样没有任何效果.void x;并非如此short x;.哪一项更正确?如果没有,那么如何解释编译器警告的差异?
鉴于以下代码:
void test(int var)
{
Q_UNUSED(var);
#ifdef SOMETHING
printf("%d",var);
//do something else with var...
#endif
}
Run Code Online (Sandbox Code Playgroud)
Q_UNUSED如果我在某些情况下实际使用'var'变量(如上例中所示),那么宏是否有任何影响,或者当我抑制未使用变量的编译器警告时它根本没有效果?
到目前为止,我发现它没有效果,但我想确定一下.
说我有
[[nodiscard]] int foo ()
{
return 0;
}
int main ()
{
foo ();
}
Run Code Online (Sandbox Code Playgroud)
然后
error: ignoring return value of ‘int foo()’, declared with attribute nodiscard [-Werror=unused-result]
Run Code Online (Sandbox Code Playgroud)
但如果
int x = foo ();
Run Code Online (Sandbox Code Playgroud)
然后
error: unused variable ‘x’ [-Werror=unused-variable]
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方式告诉编译器"我想丢弃这个[[nodiscard]]值"?
我多次在开源代码中看到对C函数的调用被转换为void.
例如,在ls(http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/ls/ls.c)的源代码中,我看到以下内容.
(void) setlocale(LC_ALL, "");
Run Code Online (Sandbox Code Playgroud)
为什么这是一个好习惯?
Coverity抱怨我们的代码库中的各种函数调用都没有检查返回值.
未选中的返回值(CHECKED_RETURN)3.check_return:在不检查返回值的情况下调用Append(78次中的其他73次).
在过去,我们会简单地通过铸造回归解决了这个问题(后双重检查返回值真的不是很重要)void(如讨论这里):
(void)Foo.Append(bar);
Run Code Online (Sandbox Code Playgroud)
但是,我们正在开始启用所有警告,并将警告视为错误,因此我有点担心上面的代码会生成old-style-cast诊断.如果是这种情况,我需要将我们的代码修改为相当丑陋的格式:
static_cast<void>( Foo.Append(bar) );
Run Code Online (Sandbox Code Playgroud)
但是,gcc和clang似乎都可以编译这段代码(第一种形式)而不会抱怨.所以我想我的问题的最终形式是这样的:void就C风格的演员而言,是否将一个函数返回到被认为是规则的例外?或者我是否需要仔细检查我的代码并查看相关的行是否实际上没有包含在这些构建中?