c++编译时的一些问题思考(使用g++)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uestcyms/article/details/87857920

简介

主要记录使用g++编译时,遇到的一些错误和总结,由于初步接触c++,会有一些比较低级的问题。

如何与为何编写头文件

如何

转载 C++中头文件(.h)和源文件(.cpp)都应该写些什么这个帖子写的通俗易懂。
总结如下
头文件:写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等
注意点:防止重复编译

#ifndef XXXX_H
#define XXXX_H

//你的代码写在这里

#endif

源文件:源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。

为何

分离式编译,大型项目中,文件的分割很重要。
为什么用头文件和.cpp文件
C++编译主要分为两个阶段:

  • 将源文件编译为二进制“对象”文件:CPP文件是编译文件,编译时不需要关于其他CPP文件(甚至是库)的任何知识,除非通过原始声明或标题包含。 CPP文件通常被编译成一个.OBJ或一个.O“对象”文件。

        #include<iostream> // 标题包含
        using namespace std;
    
        void doSomethingElse(); // 声明
    
        void doSomething()
        {
            doSomethingElse();
        }
    
        int main()
        {
            doSomething();
            return 0;
        }
    
    
  • 将所有“对象”文件连接在一起,从而创建最终的二进制文件(库或可执行文件)

ps:不允许重复定义

/tmp/ccr3lZWd.o: In function doSomethingElse()': B.cpp:(.text+0x0): multiple definition ofdoSomethingElse()’
/tmp/cc0cldZP.o:C.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

在一个项目中,使用头文件,至少有两个目的:
清晰度,也就是说,通过使接口与实现分离,读取代码更容易
编译时间。 通过尽可能只使用接口,而不是完整的实现,编译时间可以减少,因为编译器可以简单地对接口进行引用,而不必解析实际的代码(这只是需要完成的一次)。

遇到的一些错误

error: unterminated #ifndef

未结束的#ifndef;原因是漏写了结束对应语句 #endif

ISO C++ forbids declaration of ‘getPrice’ with no type [-fpermissive]

方法定义的地方,返回参数不对;

multiple definition of `doSomethingElse()’

函数重复定义。

sorry, unimplemented: non-trivial designated initializers not supported

c++数组不支持乱序初始化,c99支持。
gcc解释

标准C90初始化程序的元素需要以照固定顺序出现,对数组和结构体也是如此。
在C99你可以按任何顺序给出,数组和结构体也是如此;GNU C也允许它作为C90模式的扩展,此扩展未在GNU C++中实现。

// C99任何顺序初始化

// 指定数组索引,"[index]=" 在元素之前
int a[6] = {[4] = 29,[2] = 15};// 相当于 int a[6]={0,0,15,0,29,0};

// 将一系列元素初始化相同的值,"[first ... last] = value"
int widths [] = {[0 ... 9] = 1,[10 ... 99] = 2,[100] = 3}; //数组的长度是指定最高值加1

// 结构初始化,".filedname="在元素值之前
struct point {int x,y;};
struct point p = {.y=yvalue,.x=xvaule}; //相当于 struct point p = {xvalue,yvalue};

// 使用"filedname:" ,gcc 2.5以来已经过时
struct point p = {y:yvalue,x:xvalue};

ps:C++中不支持乱序初始化,可以使用上面的格式"[index]=",".filedname="的用法

猜你喜欢

转载自blog.csdn.net/uestcyms/article/details/87857920