最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問題

 更新時間:2022年04月24日 14:21:51   作者:小裘HUST  
這篇文章主要介紹了在日常調(diào)試C語言中include的順序不同從而影響最后編譯結(jié)果不同的問題,究其原因是寫代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來看看吧

  今天遇到了因為include順序不同而編譯結(jié)果不同的問題。歸根結(jié)底還是自己寫代碼的習(xí)慣不好導(dǎo)致的。

編譯環(huán)境

  既然要寫就多寫點吧。最近又開始做TI的DSP C6455相關(guān)的開發(fā)了。之前的文章里有寫到,TI提供有一個CSL庫,但是比較老,輸出的格式是COFF,而現(xiàn)在一般是ELF。如果做一些新的開發(fā)的話,建議重新編譯CSL庫,并選擇輸出為ELF格式。

  C6000 DSP的編譯工具鏈目前主要有7.4和8.3版本。8.0以上的版本不再支持C6455了,所以我目前用的CGT版本是7.4.24,7.4版本的應(yīng)該都差不多,因為文檔都是一樣的。

問題簡化

  實際工程中包含大大小小的文件很多,頭文件的include層層嵌套。所以我在這里為了說明關(guān)鍵問題,把我實際遇到的問題做了簡化。整個工程包含三個文件main.cpp, CData.cpp和CData.hpp。源碼如下:

// main.cpp 
/* Scenario 1: it doesn't work */
#include "csl_types.h"
#include "CData.hpp"
/* Scenario 2: it does work */
// #include "CData.hpp"
// #include "csl_types.h"
int main(void) {
    return 0;
}
// CData.cpp 
#include "CData.hpp"
// CData.cpp 
#ifndef CDATA_HPP_
#define CDATA_HPP_
#include <assert.h>
#include <stdlib.h>
class CData {
public:
CData(): m_pData(NULL), m_nCnt(0) {}
CData(int nCnt): m_nCnt(nCnt) {
    m_pData = new int[nCnt];
    assert(m_pData != NULL);
}
~CData(){
    if(m_pData){
        delete[] m_pData;
        m_pData = NULL;
    }
}
protected:
    int *m_pData;
    int m_nCnt;
};
#endif

  實際上的現(xiàn)象就是main.cpp中include了兩個頭文件,它們include的前后順序不同,導(dǎo)致了編譯結(jié)果不同。在第一種情況下編譯得到這樣的結(jié)果:

  而在第二種情況下就是能夠正常完成編譯。

問題分析

a value of type "void *" cannot be used to initialize an entity of type "int *"
a value of type "void *" cannot be assigned to an entity of type "int *"

  報錯提示的問題和NULL有關(guān),大概意思是NULL是一個void *的類型,不能把它賦給其他類型的變量。但可以看到,單獨編譯CData.cpp是沒有出現(xiàn)問題的。而在編譯main.cpp的時候,因為先include了csl_types.h,導(dǎo)致改變了NULL的定義,所以出了問題。

  查找有NULL相關(guān)的定義的文件可以找到:

// stdlib.h
#ifndef NULL
#define NULL 0
#endif
// csl_types.h
#ifndef NULL
#define NULL ((void*)0)
#endif
// xdc/std.h
#undef NULL
#if defined(__cplusplus) || !defined(xdc__strict)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

  stdlib.h大家應(yīng)該都比較熟悉,是標(biāo)準(zhǔn)庫。csl_types.h是在用CSL的時候會不經(jīng)意間包含的一個頭文件。還有xdc/std.h是在用RTSC時可能會用到的頭文件。這幾個文件里都有關(guān)于NULL的定義。

  我這次遇到的問題就是因為前兩個文件include的前后順序不同,NULL定義的情況也就不同了。而第三個文件感覺比較好,會先undef NULL,然后再重新define,應(yīng)該可以一定程度上避免這個問題。但是第三個文件中有些類型的定義也會和csl_types.h產(chǎn)生沖突,所以用起來還是要注意。

總結(jié)

  這次雖然兩個頭文件include的順序引發(fā)的問題。但是歸根結(jié)底我覺得還是因為我直接在頭文件里做類(CData)的定義,而沒有把定義放在cpp文件中。如果把方法的具體實現(xiàn)放在源文件里,然后把那些頭文件中的include放到源文件里去,應(yīng)該可以一定程度上避免這種問題的出現(xiàn)。

  實際工程中遇到這類問題,往往include有多層,很難發(fā)現(xiàn),所以還是應(yīng)該要有一個良好的編程習(xí)慣!

到此這篇關(guān)于C語言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問題的文章就介紹到這了,更多相關(guān)C語言include順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++?string.h庫中memcpy()和memmove()的使用

    C/C++?string.h庫中memcpy()和memmove()的使用

    memcpy與memmove的目的都是將N個字節(jié)的源內(nèi)存地址的內(nèi)容拷貝到目標(biāo)內(nèi)存地址中,本文主要介紹了C/C++?string.h庫中memcpy()和memmove()的使用,感興趣的可以了解一下
    2023-12-12
  • C++通信新特性協(xié)程詳細(xì)介紹

    C++通信新特性協(xié)程詳細(xì)介紹

    這篇文章主要給大家分享得是C++的特性協(xié)程Coroutine,下面文章內(nèi)容我們將來具體介紹什么是協(xié)程,協(xié)程得好處等知識點,需要的朋友可以參考一下
    2022-10-10
  • C語言簡易實現(xiàn)掃雷小游戲

    C語言簡易實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言簡易實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 基于QT實現(xiàn)文件上傳和下載功能

    基于QT實現(xiàn)文件上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了基于QT實現(xiàn)文件上傳和下載功能,支持?jǐn)帱c續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一篇文章教你用C語言模擬實現(xiàn)字符串函數(shù)

    一篇文章教你用C語言模擬實現(xiàn)字符串函數(shù)

    這篇文章主要介紹了C語言模擬實現(xiàn)字符串函數(shù),開發(fā)程序的時候經(jīng)常使用到一些字符串函數(shù),例如求字符串長度,拷貝字符串……,需要的朋友可以參考下
    2021-09-09
  • C++lambda表達(dá)式使用介紹

    C++lambda表達(dá)式使用介紹

    Lambda 表達(dá)式(lambda expression)是一個匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名。本文就來為大家詳細(xì)講講C++中Lambda表達(dá)式的使用,需要的可以參考一下
    2022-08-08
  • 實例詳解C++中指針與引用的區(qū)別

    實例詳解C++中指針與引用的區(qū)別

    引用是C++引入的重要機制(C語言沒有引用),它使原來在C中必須用指針來實現(xiàn)的功能有了另一種實現(xiàn)的選擇,在書寫形式上更為簡潔,那么引用的本質(zhì)是什么,它與指針又有什么關(guān)系呢?這篇文章主要給大家介紹了關(guān)于C++中指針與引用的區(qū)別,需要的朋友可以參考下
    2021-07-07
  • C++利用PCL點云庫操作txt文件詳解

    C++利用PCL點云庫操作txt文件詳解

    這篇文章主要為大家詳細(xì)介紹了C++如何利用PCL點云庫操作txt文件,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2024-01-01
  • OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹

    OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹

    這篇文章主要介紹了OpenCV圖像旋轉(zhuǎn)Rotate,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++使用redis的實例詳解

    C++使用redis的實例詳解

    這篇文章主要介紹了C++使用redis的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評論

新竹县| 故城县| 隆林| 海晏县| 色达县| 叙永县| 咸丰县| 射洪县| 莱阳市| 黑山县| 那坡县| 杭锦旗| 罗定市| 石家庄市| 南雄市| 海淀区| 双桥区| 莫力| 濮阳市| 昭苏县| 甘南县| 蕉岭县| 喀喇| 来宾市| 德州市| 赤水市| 华安县| 都兰县| 容城县| 房产| 铜川市| 汶川县| 炉霍县| 包头市| 崇信县| 富蕴县| 紫阳县| 叙永县| 陈巴尔虎旗| 莆田市| 尼勒克县|