(1).變量一般不要界說在.h文件中。
還是把頭文件的內容都放在#ifndef和#endif中吧翻譯不管你的頭文件會不會被多個文件引用,你都要加上這個。一般花式是這樣的:
#endif
(1).當你第一個使用這個頭的.cpp文件生成.obj的時辰,int i 在裡面界說了當別的一個利用這個的.cpp再次[零丁]生成.obj的時候,int i 又被界說然後兩個obj被別的一個.cpp也include 這個頭的,毗連在一路,就會呈現反複定義.
2.在#ifndef中界說變量泛起的問題(一般不界說在#ifndef中)。
解決方式:
結論:
#ifndef AAA
#define AAA
...
int i;
...
#endif
裡面有一個變量界說
在vc中鏈接時就泛起了i重複界說的錯誤,而在c中成功編譯。
(1).把源法式文件擴展名改成.c翻譯
<標識>在理論上來說可以是自由定名的,但每一個頭文件的這個「標識」都應當是獨一的。標識的定名法則通常爲頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h
感化規模就是當前文件啊。因為編譯是以cpp或c文件位單元的嘛。還以這個為例:
//正常代碼
#ifdef _DEBUG
TRACE("Some infomation");
#else
//Now is release version,so do nothing
#endif
//正常代碼
編譯時是先把所有的預編譯處置睜開(比如宏)再編譯,所以Debug模式下,編譯時的代碼是:
//正常代碼
TRACE("Some infomation");
//正常代碼
Release模式下的代碼是:
//正常代碼
//正常代碼
一般情形下,源法式中所有的行都加入編譯。可是有時但願對此中一部份內容只在知足一定前提才進行編譯,也就是對一部門內容指定編譯的前提,這就是「前提編譯」。有時,但願當知足某前提時對一組語句進行編譯,而當條件不知足時則編譯另一組語句。
前提編譯號令最多見的情勢為:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的感化是:當標識符已經被界說過(通常爲用#define號令界說),則對法式段1進行編譯,不然編譯程序段2。
個中#else部分也能夠沒有,即:
#ifdef
程序段1
#denif
這裡的「法式段」可所以語句組,也能夠是饬令行翻譯這種條件編譯可以提高C源法式的通用性。如果一個C源法式在分歧計較機系統上系統上運行,而分歧的計較機
又有一定的差別翻譯例如,華頓翻譯公司們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應當利用float透露表現,如許常常需要對源
法式作需要的點竄,這就下降了程序的通用性。可以用以下的前提編譯:
#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif
若是在Windows上編譯法式,則可以在法式的起頭加上
#define WINDOWS
如許則編譯下面的敕令行:
#define MYTYPE long
假如在這組條件編譯號令之前曾呈現以下號令行:
#define WINDOWS 0
則預編譯後法式中的MYTYPE都用float代替翻譯這樣,源法式可以不必作任何點竄就能夠用於分歧類型的計較機系統。固然以上介紹的只是一種簡單的環境,可以憑據此思緒設計出其它的條件編譯翻譯
例如,在調試法式時,經常但願輸出一些所需的信息,而在調試完成後不再輸出這些信息。可以在源法式中插入以下的前提編譯段:
#ifdef DEBUG
print ("device_open(%p) "翻譯社 file);
#endif
如果在它的前面有以下命令行:
#define DEBUG
則在法式運行時輸出file指針的值,以便調試分析。調試完成後只需將這個define敕令行刪除便可。有人可能感覺不消前提編譯也可達此目標,即在調試
時加一批printf語句,調試後逐一將printf語句刪除去。的確,這是可以的。但是,當調試時加的printf語句比較多時,點竄的工作量是很大
的翻譯用前提編譯,則沒必要逐一刪改printf語句,只需刪除前面的一條「#define
DEBUG」號令便可,這時候所有的用DEBUG作標識符的條件編譯段都使個中的printf語句不起作用,即起同一節制的感化,猶如一個「開關」一樣。
有時也採用下面的情勢:
#ifndef 標識符
法式段1
#else
法式段2
#endif
只是第一行與第一種形式分歧:將「ifdef」改為「ifndef」。它的作用是:若標識符未被界說則編譯法式段1,不然編譯法式段2翻譯這種情勢與第一種形式的感化相反。
以上兩種情勢用法差不多,按照需要任選一種,視便利而定。
還有一種情勢,就是#if後面的是一個表達式,而不是一個簡單的標識符:
#if 表達式
法式段1
#else
法式段2
#endif
它的感化是:當指定的表達式值為真(非零)時就編譯程序段1,不然編譯程序段2。可以事前給定必然前提,使法式在不同的條件下履行不同的功能翻譯
#ifndef <標識>
#define <標識>
---------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------
<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;
......
(2).把源法式文件擴展名改成.c後,VC依照C說話的語法對源法式進行編譯,而不是C++翻譯在C說話中,若是碰到多個int i,則主動認為個中一個是界說,其他的是聲明翻譯
#endif
(2).推薦解決方案:
.h中只聲明 extern int i;在.cpp中定義
文件中的#ifndef
頭件的中的#ifndef,這是一個很要害的東西翻譯好比 (3).C語言和C++說話連接成果分歧,可能(猜想)時在進行編譯的時刻,C++語言將全局 ...... 注意問題: #ifndef _STDIO_H_
變量默許為強符號,所以連接失足。C說話則遵照是不是初始化進行強弱的判定的。(參考)
......
#define _STDIO_H_
本文來自: http://huenlil.pixnet.net/blog/post/24339151-%5B%E8%BD%89%5D%23ifndef,-%23define,-%23endif%E7%9A%84%有關各國語文翻譯公證的問題歡迎諮詢華頓翻譯公司02-77260932
留言列表