欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

頭文件不宜定義變量的原因全面解析

 更新時(shí)間:2013年09月17日 10:26:24   作者:  
以下是對(duì)頭文件不宜定義變量的原因進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下

test-1.0使用#ifndef只是防止了頭文件被重復(fù)包含(其實(shí)本例中只有一個(gè)頭件,不會(huì)存在重復(fù)包含的問題),但是無法防止變量被重復(fù)定義。

復(fù)制代碼 代碼如下:

# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"

extern i;
extern void test1();
extern void test2();

int main()
{
   test1();
   printf("ok\n");
   test2();
   printf("%d\n",i);
   return 0;
}


# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_

char add1[] = "www.shellbox.cn\n";
char add2[] = "www.scriptbox.cn\n";
int i = 10;
void test1();
void test2();

#endif

# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"

extern char add1[];

void test1()
{
   printf(add1);
}

# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"

extern char add2[];
extern i;

void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}


復(fù)制代碼 代碼如下:

# Makefile
-------------------------------
test:    test.o test1.o test2.o
test1.o: test1.c
test2.o: test2.c
clean:
   rm test test.o test1.o test2.o

錯(cuò)誤:
test-1.0編譯后會(huì)出現(xiàn)"multiple definition of"錯(cuò)誤。

錯(cuò)誤分析:
由于工程中的每個(gè).c文件都是獨(dú)立的解釋的,即使頭文件有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他文件中只要包含了global.h就會(huì)獨(dú)立的解釋,然后每個(gè).c文件生成獨(dú)立的標(biāo)示符。在編譯器鏈接時(shí),就會(huì)將工程中所有的符號(hào)整合在一起,由于文件中有重名變量,于是就出現(xiàn)了重復(fù)定義的錯(cuò)誤。

解決方法
在.c文件中聲明變量,然后建一個(gè)頭文件(.h文件)在所有的變量聲明前加上extern,注意這里不要對(duì)變量進(jìn)行的初始化。然后在其他需要使用全局變量的.c文件中包含.h文件。編譯器會(huì)為.c生成目標(biāo)文件,然后鏈接時(shí),如果該.c文件使用了全局變量,鏈接器就會(huì)鏈接到此.c文件 。

test-2.0

復(fù)制代碼 代碼如下:

# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"

int i = 10;
char add1[] = "www.shellbox.cn\n";
char add2[] = "www.scriptbox.cn\n";
extern void test1();
extern void test2();

int main()
{
   test1();
   printf("ok\n");
   test2();
   printf("%d\n",i);
   return 0;
}


# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_

extern i;
extern char add1[];
extern char add2[];

void test1();
void test2();

#endif

# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"

void test1()
{
   printf(add1);
}

# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"

void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}


個(gè)人認(rèn)為解決此類問題有幾種辦法:
1.在.cpp里定義變量,在其他調(diào)用處使用extern
2.在頭文件里使用宏定義

相關(guān)文章

  • C語言 分支語句詳解分析

    C語言 分支語句詳解分析

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句
    2021-10-10
  • C語言超詳細(xì)講解循環(huán)與分支語句基礎(chǔ)

    C語言超詳細(xì)講解循環(huán)與分支語句基礎(chǔ)

    各位小伙伴們,今天給大家?guī)淼氖茄h(huán)與分支語句,本篇將會(huì)向大家介紹這些語句的格式和使用的基本方法,感興趣的朋友來看看吧
    2022-04-04
  • C++簡單又輕松的講解類和對(duì)象中友元函數(shù)

    C++簡單又輕松的講解類和對(duì)象中友元函數(shù)

    采用類的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-06-06
  • Qt編程實(shí)現(xiàn)小時(shí)鐘

    Qt編程實(shí)現(xiàn)小時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Qt編程實(shí)現(xiàn)小時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • opencv實(shí)現(xiàn)圖像傾斜校正

    opencv實(shí)現(xiàn)圖像傾斜校正

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖像傾斜校正,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程

    C語言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程

    這篇文章主要為大家詳細(xì)介紹了如何用C語言實(shí)現(xiàn)流行游戲球球大作戰(zhàn),文中示例代碼介紹的非常詳細(xì),如果過程中有問題在文末還有視頻講解,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言使用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    C語言使用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言使用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言數(shù)組超詳細(xì)講解上

    C語言數(shù)組超詳細(xì)講解上

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C語言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    C語言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們?cè)诿嬖嚭痛笮捅荣愔谐3?huì)遇到一個(gè)熱門考點(diǎn):結(jié)構(gòu)體內(nèi)存對(duì)齊,也就是計(jì)算結(jié)構(gòu)體大小。接下來請(qǐng)跟著筆者一起來學(xué)習(xí)這塊知識(shí)點(diǎn)吧
    2021-10-10
  • 關(guān)于C++STL string類的介紹及模擬實(shí)現(xiàn)

    關(guān)于C++STL string類的介紹及模擬實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于C++STL string類的介紹及模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下面具體的文章內(nèi)容
    2021-09-09

最新評(píng)論