自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?
我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?
评论中要求的示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...编译.
我读了关于属性的这个问题noreturn,它用于不返回调用者的函数.
然后我用C做了一个程序.
#include <stdio.h>
#include <stdnoreturn.h>
noreturn void func()
{
printf("noreturn func\n");
}
int main()
{
func();
}
Run Code Online (Sandbox Code Playgroud)
并使用以下代码生成代码的汇编:
.LC0:
.string "func"
func:
pushq %rbp
movq %rsp, %rbp
movl $.LC0, %edi
call puts
nop
popq %rbp
ret // ==> Here function return value.
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
call func
Run Code Online (Sandbox Code Playgroud)
为什么函数func()在提供noreturn属性后返回?
我发现了一种情况,在这种情况下,Clang会产生非法指令,gcc没有这样做,同时试验这个问题.
我的问题是:我做错了什么,或者这是Clang的实际问题?
我把它归结为重现问题所需的最小片段.
拿文件eigen.cpp:
#include <iostream>
#define EIGEN_MATRIXBASE_PLUGIN "eigen_matrix_addons.hpp"
#include <Eigen/Dense>
int main() {
Eigen::Matrix2d A;
A << 0, 1, 2, 3;
std::cout << A << "\n";
}
Run Code Online (Sandbox Code Playgroud)
和文件eigen_matrix_addons.hpp:
friend std::ostream &operator<<(std::ostream &o, const Derived &m) {
o << static_cast<const MatrixBase<Derived> &>(m);
}
Run Code Online (Sandbox Code Playgroud)
(有关此文件的详细说明,请参见此处.简而言之,其内容直接放在类的定义中template<class Derived> class MatrixBase;.因此,这会引入另一个ostream运算符Derived,调用ostream运算符的Eigen实现MatrixBase<Derived>.此动机为此如果你读这个问题就会变得很明显.)
使用GCC编译并运行:
$ g++ -std=c++11 -Wall -Wextra -pedantic -isystem/usr/include/eigen3 -I. -o eigen_gcc eigen.cpp
$ ./eigen_gcc
0 1 …Run Code Online (Sandbox Code Playgroud) 在查看工作代码时,我发现了一些(看似)令人反感的代码,其中函数具有返回类型,但没有返回.我知道代码有效,但认为它只是编译器中的一个错误.
我编写了以下测试并使用我的编译器运行它(gcc(Homebrew gcc 5.2.0)5.2.0)
#include <stdio.h>
int f(int a, int b) {
int c = a + b;
}
int main() {
int x = 5, y = 6;
printf("f(%d,%d) is %d\n", x, y, f(x,y)); // f(5,6) is 11
return 0;
}
Run Code Online (Sandbox Code Playgroud)
类似于我在工作中发现的代码,这默认返回函数中执行的最后一个表达式的结果.
我发现了这个问题,但对答案不满意.我知道-Wall -Werror可以避免这种行为,但为什么它是一个选项呢?为什么这仍然允许?
有没有人知道gcc/g ++选项如果某个函数具有非void返回值但在其定义中不包含return语句,则会生成错误/警告?
例如:
int add(int a, int b)
{
a+b;
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢了!
c++ compiler-construction gcc compiler-errors compiler-warnings
我在C中实现了一些基本的数据结构,我发现如果我从函数中省略了返回类型并调用该函数,则编译器不会生成错误.我编译cc file.c并没有使用-Wall(所以我错过了警告)但在其他编程语言中这是一个严重的错误,程序将无法编译.
根据Graham Borland的要求,这是一个简单的例子:
int test()
{
printf("Hi!");
}
int main()
{
test();
}
Run Code Online (Sandbox Code Playgroud) 用非空返回类型定义函数是否合法,这使控件可以到达函数的末尾而不是返回语句吗?
gcc并且clang仅对此发出警告。这些代码合法吗?或者这些编译器是否慷慨?
gcc:
警告:函数中没有return语句,返回非空[-Wreturn-type]
铛:
警告:控制到达非无效函数的结尾[-Wreturn-type]
如果这是合法的,那么对于返回的值是否存在定义的行为?
#include <iostream>
#include<stdlib.h>
using namespace std;
class test{
public:
test(int a):i(a){
}
int display();
private:
int i;
};
int test::display(){
i;
}
int main() {
test obj(10);
cout<<obj.display();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的情况下,打印一些随机值.但是当我将函数声明更改为:
int& display();
Run Code Online (Sandbox Code Playgroud)
和定义为:
int& test::display(){
i;
}
Run Code Online (Sandbox Code Playgroud)
它显示正确的值,即10我不知道为什么?
如果"a function"是单独编译的,那么就不会检测到不匹配,"函数"会返回一个main,它将main视为一个int ...根据我们所说的声明如何必须匹配定义,这可能会似乎令人惊讶.可能发生不匹配的原因是,如果没有函数原型,则函数通过其在表达式中的第一次出现来隐式声明,例如
sum += "the function"(line);
Run Code Online (Sandbox Code Playgroud)
如果先前未声明的名称出现在表达式中并且后跟左括号,则上下文将其声明为函数名称,假定该函数返回int,并且不假设其参数.
我事先为这个含糊不清的问题道歉,但这是什么意思?
顺便说一下,这是Brian W. Kernighan和Dennis M. Ritchie的C编程语言书第2版第73页第4.3章.
我写了一个简单的函数来返回一个字符串让我在屏幕上显示.
static std::string myFun(int myId){
std::ostringstream stream;
int myStatus;
if(get_status(&myStatus)) stream << get_error();
else{
stream << "my status:" << myStatus;
}
return stream.str();
}
Run Code Online (Sandbox Code Playgroud)
代码本身可能并不重要.但我把它包含在以防万一.我遇到的问题是因为在我最初的尝试中,我忘了包含return语句
return stream.str();
Run Code Online (Sandbox Code Playgroud)
编译器编译没有错误,但是当我运行它时.该程序不断收到消息
Aborted(core dumped)
Run Code Online (Sandbox Code Playgroud)
我吓坏了,我搜索了stackoverflow并安装了valgrind和一切.然后我检查代码,我意识到我只是忘记包含return语句!我希望编译器能够注意到这些错误.
有人可以向我解释为什么编译器无法检测到错误吗?