C extern關鍵字

13 篇文章 1 订阅

C extern關鍵字

extern關鍵字

extern關鍵字是C語言裡已有的特性。
TensorRT/samples/common/logger.h中,使用extern關鍵字"宣告"(注意不是定義)了以下變數:

extern Logger gLogger;
extern LogStreamConsumer gLogVerbose;
extern LogStreamConsumer gLogInfo;
extern LogStreamConsumer gLogWarning;
extern LogStreamConsumer gLogError;
extern LogStreamConsumer gLogFatal;

上面這些變數尚未被定義,但是顯然它們必須被定義一次(且只能被定義一次)。在TensorRT/samples/common/logger.cpp中便"定義"了這些變數(在這個過程中會為他們分配記憶體):

Logger gLogger{Logger::Severity::kINFO};
LogStreamConsumer gLogVerbose{LOG_VERBOSE(gLogger)};
LogStreamConsumer gLogInfo{LOG_INFO(gLogger)};
LogStreamConsumer gLogWarning{LOG_WARN(gLogger)};
LogStreamConsumer gLogError{LOG_ERROR(gLogger)};
LogStreamConsumer gLogFatal{LOG_FATAL(gLogger)};

由於extern使得這些變數可以被其它檔案看到,因此在TensorRT/samples/opensource/sampleMNIST/sampleMNIST.cpp才可以使用gLogger這個變數:

#include "logger.h"
//...
bool SampleMNIST::build()
{
    auto builder = SampleUniquePtr<nvinfer1::IBuilder>(nvinfer1::createInferBuilder(gLogger.getTRTLogger()));
    //...
}

我們知道extern能使一個變數被其它檔案看到,而直接在logger.h裡"定義"這些變數也可以達到一樣的效果,那麼為什麼我們不這樣做呢?這是因為在編譯後,每個引用 logger.h 的 compilation unit裡都會有一份該變數的定義,到了link的時候,就會出現multiple definition error,更多範例詳見Demo of “extern” keyword in C

參考連結

Demo of “extern” keyword in C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值