關於 errno的使用

2021-04-14 02:02:44 字數 1383 閱讀 2520

errno

是乙個全域性的變數,在

errno.h

中有它的定義:

#if(defined(_mt) || defined(_dll)) && !defined(_mac)

_crtimp 

extern

int* __cdecl _errno(

void

);#define

errno   (*_errno())

#else

/* ndef _mt && ndef _dll */

_crtimp 

extern

interrno;

#endif

/* _mt || _dll */

實際上,

errno

是乙個指向函式的指標,在

linux/unix

環境下,

errno

是多執行緒安全的

。但是在

windows

下使用就會有很大的麻煩。

今天在vc 6.0

下寫了乙個簡單的程式來使用一下:

gao2.h

#ifndef _gao2_h_

#define _gao2_h_

#include

_declspec (dllexport) int add(int a,int b);

#endif //_gao2_h_

gao2.def

exports

add@1

gao2.cpp

#include

#include "gao2.h"

_declspec (dllexport)

int add(int a,int b)

另寫了乙個測試程式,來測試這個

dll,

#include

#include

#include

#include "gao2.h"

void main() }

但是,返回的

errno

卻不是einval,

總覺得這是

2個不同的執行緒,兩個

errno

不是同乙個位址,後來經過修改了兩個程式的

project

àsetting

àc/c++

àcategory

àcodegeneration

àmultithread dll

,才得以通過。

這個好像和

linux

下使用有些不同

,大家也可以試試,

關於errno與perror,strerror函式

為什麼,要強調errno看起來好像是乙個整形變數呢?因為有的標準 如iso c 只規定了errno的作用,而沒有規定它的實現方式,它可能被定義成乙個變數,也有可能被定義成乙個巨集,這個具體要看編譯器自己的實現。早些時候,posix.1曾把errno定義成extern int errno這種形式,但現...

關於errno與perror,strerror函式

為什麼,要強調errno看起來好像是乙個整形變數呢?因為有的標準 如iso c 只規定了errno的作用,而沒有規定它的實現方式,它可能被定義成乙個變數,也有可能被定義成乙個巨集,這個具體要看編譯器自己的實現。早些時候,posix.1曾把errno定義成extern int errno這種形式,但現...

關於errno標頭檔案

看見網上很多地方都用到這個標頭檔案,一直不理解,今天找了一些資料,可以方便自己理解 errno是乙個巨集,它定義在對應的標頭檔案裡面,這個在上面的鏈結裡也有說到 errno是乙個全域性變數,它儲存了最近一次的錯誤。我常看見的乙個 是 errno eexisteexist的中文翻譯是錯誤已經存在 也就...