对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.
谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.
要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:
在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?
今天早上我在我的一个图书馆找到了这个:
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out)
{
tvec3::Min(a,b,out);
out.w = min(a.w,b.w);
}
Run Code Online (Sandbox Code Playgroud)
我期望编译器错误,因为此方法不返回任何内容,并且返回类型不返回void.
想到的唯一两件事是
在调用此方法的唯一位置,不使用或存储返回值.(此方法应该是void- tvec4返回类型是复制和粘贴错误)
tvec4正在创建一个默认构造,这看起来有点不同,哦,C++中的其他所有东西.
我还没有找到解决这个问题的C++规范部分.参考文献(ha)表示赞赏.
更新
在某些情况下,这会在VS2012中生成错误.我没有缩小具体细节,但它仍然很有趣.
有没有办法用visual studio禁用cpp文件中的单个警告线?
例如,如果我捕获异常并且不处理它,则会收到错误4101(未引用的局部变量).有没有办法在该函数中忽略它,否则在编译单元中报告它?此刻,我放在#pragma warning (disable : 4101)文件的顶部,但显然只是将它关闭整个单元.
如果函数的返回类型不是void,并且函数没有返回任何内容,那么我猜编译器会返回一个垃圾值(可能被视为未初始化的值).它发生在编译时,为什么不应该抛出错误呢?
例如,
int func1() {
return; // error
}
int func2() {
// does not return anything
}
Run Code Online (Sandbox Code Playgroud)
第二个func2应该抛出错误,但事实并非如此.有原因吗?我的想法是,它可以看作是一个未初始化的值,所以如果我们需要在第二种情况下抛出错误,那么我们需要抛出错误,如果一个值是未初始化的,比如说
int i; // error
int i = 6; // okay
Run Code Online (Sandbox Code Playgroud)
有什么想法,或者这是一个重复的问题?我感谢您的帮助.
正如所料,编译器(VisualStudio 2008)将发出警告
警告C4715:'doSomethingWith':并非所有控制路径都返回一个值
编译以下代码时:
int doSomethingWith(int value)
{
int returnValue = 3;
bool condition = false;
if(condition)
// returnValue += value; // DOH
return returnValue;
}
int main(int argc, char* argv[])
{
int foo = 10;
int result = doSomethingWith(foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但程序运行得很好.函数doSomethingWith()的返回值为0.
是仅仅是未定义的行为,还是存在一定的规则如何在运行时创建/计算结果值.非POD数据类型作为返回值会发生什么?
我编写了一个递归函数,用于查找数组中的最小数,效果很好。
/*01*/ int minimo(int array[], int n)
/*02*/ {
/*03*/ static int min = 0;
/*04*/
/*05*/ if (n == N)
/*06*/ {
/*07*/ return array[n-1];
/*08*/ }
/*09*/ else
/*10*/ {
/*11*/ min = minimo(array, n+1);
/*12*/ if(array[n]<min){
/*13*/ min = array[n];
/*14*/ }
/*15*/ }
/*16*/ }
Run Code Online (Sandbox Code Playgroud)
唯一的问题是它不应该工作,因为它不会将“min”返回给调用者......
int main()
{
//Var
int array[N] = {10, 2, 5, 1, 7};
printf("Min: %d\n", minimo(array, 0));
}
Run Code Online (Sandbox Code Playgroud)
我的担忧实际上是一个问题,但不是在我的机器上,该功能可以正常工作;这是我朋友的笔记本电脑和 IDE 上的一个问题,我尝试在朋友的 Macbook 上复制到 XCode,但如果“return min;”这一行就无法工作。未在函数末尾添加。
在第 15-16 行之间,我必须添加 …
void main()
{
int y=0;
clrscr();
printf("%d\n",Testing());
y=Testing();
printf("%d",y);
getch();
}
int Testing()
{
int x=100;
//return x;
}
Result
512
4
Run Code Online (Sandbox Code Playgroud)
我没有从测试功能返回任何东西还有价值吗?
另一个问题也是
void main()
{
char Testing();
int y=0;
clrscr();
printf("%d\n",Testing());
if(Testing())
printf("if--exi");
else
printf("else--exi");
getch();
}
char Testing()
{
char y;
//return y;
}
Result
0
if--exi
Run Code Online (Sandbox Code Playgroud)
如果printf被评论,那么结果是
else--exi
Run Code Online (Sandbox Code Playgroud)
为什么会这样发生
我有一个返回bool的函数:
bool restart()
{
std::string answer;
bool answered = false;
while(answered == false)
{
cout << endl << endl << "Do you want to play again? y/n : ";
cin >> answer;
if(answer == "y" || answer == "Y" || answer == "1" || answer == "yes")
{return true;}
if(answer == "n" || answer == "N" || answer == "0" || answer == "no")
{return false;}
}
}
Run Code Online (Sandbox Code Playgroud)
当我用它来调用它时:
cout << restart();
Run Code Online (Sandbox Code Playgroud)
我得到输出:
Do you want to play again? y/n …Run Code Online (Sandbox Code Playgroud) 使用gcc5.2.0,我注意到这段代码没有生成警告:
#include <stddef.h>
int function(void)
{
return NULL;
}
void procedure(void)
{
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
我使用了旗帜-Wall -Wextra -std=c99 -pedantic,我正在运行archlinux.我不确定为什么这段代码可以正常工作gcc,特别是因为clang3.7.0会产生警告.
我也尝试使用gcc类似4.9或4.7的旧版本,它们都会产生警告.
警告是:
warning: return makes integer from pointer without a cast
Run Code Online (Sandbox Code Playgroud)
和
warning: ‘return’ with a value, in function returning void
Run Code Online (Sandbox Code Playgroud)
我应该提一下,我尝试在Debian上编译gcc 5.2,结果是一样的.所以archlinux似乎不是问题所在.
理由是什么?我似乎无法在其他任何地方找到与此相关的任何内容.
谢谢!