99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)解析extern "C"的底層原理與實(shí)際應(yīng)用

工程師進(jìn)階筆記 ? 來源:博客園 ? 2023-05-11 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

本文詳細(xì)解析extern "C"的底層原理與實(shí)際應(yīng)用。

在你工作過的系統(tǒng)里,不知能否看到類似下面的代碼。

765ced9a-ef4d-11ed-90ce-dac502259ad0.jpg

這好像沒有什么問題,你應(yīng)該還會想:“嗯?是啊,我們的代碼都是這樣寫的,從來沒有因此碰到過什么麻煩啊~”。

你說的沒錯(cuò),如果你的頭文件從來沒有被任何C++程序引用過的話。

這與C++有什么關(guān)系呢? 看看__cplusplus(注意前面是兩個(gè)下劃線) 的名字你就應(yīng)該知道它與C++有很大關(guān)系。__cplusplus是一個(gè)C++規(guī)范規(guī)定的預(yù)定義宏。

你可以信任的是:所有的現(xiàn)代C++編譯器都預(yù)先定義了它;而所有C語言編譯器則不會。另外,按照規(guī)范__cplusplus的值應(yīng)該等于1 9 9 7 1 1 L ,然而不是所有的編譯器都照此實(shí)現(xiàn),比如g++編譯器就將它的值定義為1。

所以,如果上述代碼被C語言程序引用的話,它的內(nèi)容就等價(jià)于下列代碼。

766d6738-ef4d-11ed-90ce-dac502259ad0.jpg

在這種情況下,既然extern "C" { }經(jīng)過預(yù)處理之后根本就不存在,那么它和#include指令之間的關(guān)系問題自然也就是無中生有。

extern "C"的前世今生

在C++編譯器里,有一位暗黑破壞神,專門從事一份稱作“名字粉碎”(name mangling)的工作。當(dāng)把一個(gè)C++的源文件投入編譯的時(shí)候,它就開始工作,把每一個(gè)它在源文件里看到的外部可見的名字粉碎的面目全非,然后存儲到二進(jìn)制目標(biāo)文件的符號表里。

之所以在C++的世界里存在這樣一個(gè)怪物,是因?yàn)镃++允許對一個(gè)名字給予不同的定義,只要在語義上沒有二義性就好。

比如,你可以讓兩個(gè)函數(shù)是同名的,只要它們的參數(shù)列表不同即可,這就是函數(shù)重載(function overloading);甚至,你可以讓兩個(gè)函數(shù)的原型聲明是完全相同的,只要它們所處的名字空間(namespace)不一樣即可。

事實(shí)上,當(dāng)處于不同的名字空間時(shí),所有的名字都是可以重復(fù)的,無論是函數(shù)名,變量名,還是類型名。

另外,C++程序的構(gòu)造方式仍然繼承了C語言的傳統(tǒng):編譯器把每一個(gè)通過命令行指定的源代碼文件看做一個(gè)獨(dú)立的編譯單元,生成目標(biāo)文件;然后,鏈接器通過查找這些目標(biāo)文件的符號表將它們鏈接在一起生成可執(zhí)行程序。

編譯和鏈接是兩個(gè)階段的事情;事實(shí)上,編譯器和鏈接器是兩個(gè)完全獨(dú)立的工具。編譯器可以通過語義分析知道那些同名的符號之間的差別;而鏈接器卻只能通過目標(biāo)文件符號表中保存的名字來識別對象。

所以,編譯器進(jìn)行名字粉碎的目的是為了讓鏈接器在工作的時(shí)候不陷入困惑,將所有名字重新編碼,生成全局唯一,不重復(fù)的新名字,讓鏈接器能夠準(zhǔn)確識別每個(gè)名字所對應(yīng)的對象。

但 C語言卻是一門單一名字空間的語言,也不允許函數(shù)重載,也就是說,在一個(gè)編譯和鏈接的范圍之內(nèi),C語言不允許存在同名對象。

比如,在一個(gè)編譯單元內(nèi)部,不允許存在同名的函數(shù),無論這個(gè)函數(shù)是否用static修飾;在一個(gè)可執(zhí)行程序?qū)?yīng)的所有目標(biāo)文件里,不允許存在同名對象,無論它代表一個(gè)全局變量,還是一個(gè)函數(shù)。

所以,C語言編譯器不需要對任何名字進(jìn)行復(fù)雜的處理(或者僅僅對名字進(jìn)行簡單一致的修飾(decoration),比如在名字前面統(tǒng)一的加上單下劃線_)。

C++的締造者Bjarne Stroustrup在最初就把——能夠兼容C,能夠復(fù)用大量已經(jīng)存在的C庫——列為C++語言的重要目標(biāo)。

但兩種語言的編譯器對待名字的處理方式是不一致的,這就給鏈接過程帶來了麻煩。

例如,現(xiàn)有一個(gè)名為my_handle.h的頭文件,內(nèi)容如下:

767da86e-ef4d-11ed-90ce-dac502259ad0.jpg

然后使用C語言編譯器編譯my_handle.c,生成目標(biāo)文件my_handle.o。

由于C語言編譯器不對名字進(jìn)行粉碎,所以在my_handle.o的符號表里,這三個(gè)函數(shù)的名字和源代碼文件中的聲明是一致的。

76a1401c-ef4d-11ed-90ce-dac502259ad0.jpg

隨后,我們想讓一個(gè)C++程序調(diào)用這些函數(shù),所以,它也包含了頭文件my_handle.h。

假設(shè)這個(gè)C++源代碼文件的名字叫my_handle_client.cpp,其內(nèi)容如下:

76b97240-ef4d-11ed-90ce-dac502259ad0.jpg

其中,粗體的部分就是那三個(gè)函數(shù)的名字被粉碎后的樣子。

然后,為了讓程序可以工作,你必須將my_handle.o和my_handle_client.o放在一起鏈接。由于在兩個(gè)目標(biāo)文件對于同一對象的命名不一樣,鏈接器將報(bào)告相關(guān)的“符號未定義”錯(cuò)誤。

76cfaac4-ef4d-11ed-90ce-dac502259ad0.jpg

為了解決這一問題,C++引入了鏈接規(guī)范(linkage specification)的概念,表示法為extern"language string",C++編譯器普遍支持的"language string"有"C"和"C++",分別對應(yīng)C語言和C++語言。

鏈接規(guī)范的作用是告訴C++編譯:對于所有使用了鏈接規(guī)范進(jìn)行修飾的聲明或定義,應(yīng)該按照指定語言的方式來處理,比如名字,調(diào)用習(xí)慣(calling convention)等等。

鏈接規(guī)范的用法有兩種:

1.單個(gè)聲明的鏈接規(guī)范,比如:

extern "C" void foo();

2. 一組聲明的鏈接規(guī)范,比如:

extern "C"
{
void foo();
int bar();
}

對我們之前的例子而言,如果我們把頭文件my_handle.h的內(nèi)容改成:

76e2aba6-ef4d-11ed-90ce-dac502259ad0.jpg

然后使用C++編譯器重新編譯my_handle_client.cpp,所生成目標(biāo)文件my_handle_client.o中的符號表就變?yōu)椋?/p>

76f6b330-ef4d-11ed-90ce-dac502259ad0.jpg

從中我們可以看出,此時(shí),用extern "C" 修飾了的聲明,其生成的符號和C語言編譯器生成的符號保持了一致。這樣,當(dāng)你再次把my_handle.o和my_handle_client.o放在一起鏈接的時(shí)候,就不會再有之前的“符號未定義”錯(cuò)誤了。

但此時(shí),如果你重新編譯my_handle.c,C語言編譯器將會報(bào)告“語法錯(cuò)誤”,因?yàn)閑xtern"C"是C++的語法,C語言編譯器不認(rèn)識它。此時(shí),可以按照我們之前已經(jīng)討論的,使用宏__cplusplus來識別C和C++編譯器。修改后的my_handle.h的代碼如下:

7706315c-ef4d-11ed-90ce-dac502259ad0.jpg

小心門后的未知世界

在我們清楚了 extern "C" 的來歷和用途之后,回到我們本來的話題上,為什么不能把#include 指令放置在 extern "C" { ... } 里面?

我們先來看一個(gè)例子,現(xiàn)有a.h,b.h,c.h以及foo.cpp,其中foo.cpp包含c.h,c.h包含b.h,b.h包含a.h,如下:

771db890-ef4d-11ed-90ce-dac502259ad0.jpg

現(xiàn)使用C++編譯器的預(yù)處理選項(xiàng)來編譯foo.cpp,得到下面的結(jié)果:

7731923e-ef4d-11ed-90ce-dac502259ad0.jpg

正如你看到的,當(dāng)你把#include指令放置在extern "C" { }里的時(shí)候,則會造成extern "C" { } 的嵌套。這種嵌套是被C++規(guī)范允許的。當(dāng)嵌套發(fā)生時(shí),以最內(nèi)層的嵌套為準(zhǔn)。比如在下面代碼中,函數(shù)foo會使用C++的鏈接規(guī)范,而函數(shù)bar則會使用C的鏈接規(guī)范。

7743e24a-ef4d-11ed-90ce-dac502259ad0.jpg

如果能夠保證一個(gè)C語言頭文件直接或間接依賴的所有頭文件也都是C語言的,那么按照C++語言規(guī)范,這種嵌套應(yīng)該不會有什么問題。

但具體到某些編譯器的實(shí)現(xiàn),比如MSVC2005,卻可能由于 extern "C" { } 的嵌套過深而報(bào)告錯(cuò)誤。

不要因此而責(zé)備微軟,因?yàn)榫瓦@個(gè)問題而言,這種嵌套是毫無意義的。你完全可以通過把#include指令放置在extern "C" { }的外面來避免嵌套。

拿之前的例子來說,如果我們把各個(gè)頭文件的 #include 指令都移到extern "C" { } 之外,然后使用C++編譯器的預(yù)處理選項(xiàng)來編譯foo.cpp,就會得到下面的結(jié)果:

7751f16e-ef4d-11ed-90ce-dac502259ad0.jpg

這樣的結(jié)果肯定不會引起編譯問題的結(jié)果——即便是使用MSVC。

把 #include 指令放置在extern "C" { }里面的另外一個(gè)重大風(fēng)險(xiǎn)是,你可能會無意中改變一個(gè)函數(shù)聲明的鏈接規(guī)范。比如:有兩個(gè)頭文件a.h,b.h,其中b.h包含a.h,如下:

77620f54-ef4d-11ed-90ce-dac502259ad0.jpg

按照a.h作者的本意,函數(shù)foo是一個(gè)C++自由函數(shù),其鏈接規(guī)范為"C++"。但在b.h中,由于#include "a.h"被放到了extern "C" { }的內(nèi)部,函數(shù)foo的鏈接規(guī)范被不正確地更改了。

由于每一條 #include 指令后面都隱藏這一個(gè)未知的世界,除非你刻意去探索,否則你永遠(yuǎn)都不知道,當(dāng)你把一條條#include指令放置于extern "C" { }里面的時(shí)候,到底會產(chǎn)生怎樣的結(jié)果,會帶來何種的風(fēng)險(xiǎn)。

或許你會說,“我可以去查看這些被包含的頭文件,我可以保證它們不會帶來麻煩”。但,何必呢?畢竟,我們完全可以不必為不必要的事情買單,不是嗎?

Q & A

Q: 難道任何# i n c l u d e指令都不能放在e x t e r n "C"里面嗎?

A: 正像這個(gè)世界的大多數(shù)規(guī)則一樣,總會存在特殊情況。

有時(shí)候,你可能利用頭文件機(jī)制“巧妙”的解決一些問題。比如,#pragma pack的問題。這些頭文件和常規(guī)的頭文件作用是不一樣的,它們里面不會放置C的函數(shù)聲明或者變量定義,鏈接規(guī)范不會對它們的內(nèi)容產(chǎn)生影響。這種情況下,你可以不必遵守這些規(guī)則。

更加一般的原則是,在你明白了這所有的原理之后,只要你明白自己在干什么,那就去做吧。

Q: 你只說了不應(yīng)該放入e x t e r n "C"的,但什么可以放入呢?

A: 鏈接規(guī)范僅僅用于修飾函數(shù)和變量,以及函數(shù)類型。所以,嚴(yán)格的講,你只應(yīng)該把這三種對象放置于extern "C"的內(nèi)部。

但,你把C語言的其它元素,比如非函數(shù)類型定義(結(jié)構(gòu)體,枚舉等)放入extern "C"內(nèi)部,也不會帶來任何影響。更不用說宏定義預(yù)處理指令了。

所以,如果你更加看重良好組織和管理的習(xí)慣,你應(yīng)該只在必須使用extern "C"聲明的地方使用它。即使你比較懶惰,絕大多數(shù)情況下,把一個(gè)頭件自身的所有定義和聲明都放置在extern"C"里面也不會有太大的問題。

Q: 如果一個(gè)帶有函數(shù)/變量聲明的C頭文件里沒有e x t e r n "C"聲明怎么辦?

A: 如果你可以判斷,這個(gè)頭文件永遠(yuǎn)不可能讓C++代碼來使用,那么就不要管它。

但現(xiàn)實(shí)是,大多數(shù)情況下,你無法準(zhǔn)確的推測未來。你在現(xiàn)在就加上這個(gè)extern "C",這花不了你多少成本,但如果你現(xiàn)在沒有加,等到將來這個(gè)頭文件無意中被別人的C++程序包含的時(shí)候,別人很可能需要更高的成本來定位錯(cuò)誤和修復(fù)問題。

Q: 如果我的C+ +程序想包含一個(gè)C頭文件a . h,它的內(nèi)容包含了C的函數(shù)/變量聲明,但它們卻沒有使用e x t e r n "C"鏈接規(guī)范,該怎么辦?

A: 在a.h里面加上它。

某些人可能會建議你,如果a.h沒有extern "C",而b.cpp包含了a.h,可以在b.cpp里加上 :

extern "C"
{
#include "a.h"
}

這是一個(gè)邪惡的方案,原因在之前我們已經(jīng)闡述。但值得探討的是,這種方案這背后卻可能隱含著一個(gè)假設(shè),即我們不能修改a.h。不能修改的原因可能來自兩個(gè)方面:

1. 頭文件代碼屬于其它團(tuán)隊(duì)或者第三方公司,你沒有修改代碼的權(quán)限;

2. 雖然你擁有修改代碼的權(quán)限,但由于這個(gè)頭文件屬于遺留系統(tǒng),冒然修改可能會帶來不可預(yù)知的問題。

對 于第一種情況,不要試圖自己進(jìn)行workaround,因?yàn)檫@會給你帶來不必要的麻煩。正確的解決方案是,把它當(dāng)作一個(gè)bug,發(fā)送缺陷報(bào)告給相應(yīng)的團(tuán)隊(duì) 或第三方公司。

如果是自己公司的團(tuán)隊(duì)或你已經(jīng)付費(fèi)的第三方公司,他們有義務(wù)為你進(jìn)行這樣的修改。如果他們不明白這件事情的重要性,告訴他們。如果這些頭文 件屬于一個(gè)免費(fèi)開源軟件,自己進(jìn)行正確的修改,并發(fā)布patch給其開發(fā)團(tuán)隊(duì)。

在 第二種情況下,你需要拋棄掉這種不必要的安全意識。

因?yàn)?,首先,對于大多?shù)頭文件而言,這種修改都不是一種復(fù)雜的,高風(fēng)險(xiǎn)的修改,一切都在可控的范圍之 內(nèi);

其次,如果某個(gè)頭文件混亂而復(fù)雜,雖然對于遺留系統(tǒng)的哲學(xué)應(yīng)該是:“在它還沒有帶來麻煩之前不要?jiǎng)铀?,但現(xiàn)在麻煩已經(jīng)來了,逃避不如正視,所以上策 是,將其視作一個(gè)可以整理到干凈合理狀態(tài)的良好機(jī)會。

Q: 我們代碼中關(guān)于e x t e r n "C"的寫法如下,這正確嗎?

7771c43a-ef4d-11ed-90ce-dac502259ad0.jpg

A: 不確定。

按照C++的規(guī)范定義,__cplusplus 的值應(yīng)該被定義為199711L,這是一個(gè)非零的值;盡管某些編譯器并沒有按照規(guī)范來實(shí)現(xiàn),但仍然能夠保證__cplusplus的值為非零——至少我到目前為止還沒有看到哪款編譯器將其實(shí)現(xiàn)為0。

這種情況下,#if __cplusplus ... #endif完全是冗余的。

但,C++編譯器的廠商是如此之多,沒有人可以保證某款編譯器,或某款編譯器的早期版本沒有將__cplusplus的值定義為0。

但即便如此,只要能夠保證宏__cplusplus只在C++編譯器中被預(yù)先定義 ,那么,僅僅使用#ifdef __cplusplus ? #endif就足以確保意圖的正確性;額外的使用#if __cplusplus ... #endif反而是錯(cuò)誤的。

只有在這種情況下:即某個(gè)廠商的C語言和C++語言編譯器都預(yù)先定義了__cplusplus ,但通過其值為0和非零來進(jìn)行區(qū)分,使用#if __cplusplus ... #endif才是正確且必要的。

既然現(xiàn)實(shí)世界是如此復(fù)雜,你就需要明確自己的目標(biāo),然后根據(jù)目標(biāo)定義相應(yīng)的策略。比如:如果你的目標(biāo)是讓你的代碼能夠使用幾款主流的、正確遵守了規(guī)范的編譯器進(jìn)行編譯,那么你只需要簡單的使用#ifdef __cplusplus ... #endif就足夠了。

但如果你的產(chǎn)品是一個(gè)雄心勃勃的,試圖兼容各種編譯器的(包括未知的)跨平臺產(chǎn)品, 我們可能不得不使用下述方法來應(yīng)對各種情況 ,其中__ALIEN_C_LINKAGE__是為了標(biāo)識那些在C和C++編譯中都定義了__cplusplus宏的編譯器。

7782af16-ef4d-11ed-90ce-dac502259ad0.jpg

這應(yīng)該可以工作,但在每個(gè)頭文件中都寫這么一大串,不僅有礙觀瞻,還會造成一旦策略進(jìn)行修改,就會到處修改的狀況。違反了DRY(Don't Repeat Yourself)原則,你總要為之付出額外的代價(jià)。解決它的一個(gè)簡單方案是,定義一個(gè)特定的頭文件——比如clinkage.h,在其中增加這樣的定義:

778f590a-ef4d-11ed-90ce-dac502259ad0.jpg

以下舉例中c的函數(shù)聲明和定義分別在cfun.h 和 cfun.c 中,函數(shù)打印字符串 “this is c fun call”,c++函數(shù)聲明和定義分別在cppfun.h 和 cppfun.cpp中,函數(shù)打印字符串 "this is cpp fun call", 編譯環(huán)境vc2010

c++ 調(diào)用 c 的方法(關(guān)鍵是要讓c的函數(shù)按照c的方式編譯,而不是c++的方式)

(1) cfun.h如下:

#ifndef _C_FUN_H_
#define _C_FUN_H_


voidcfun();


#endif

cppfun.cpp 如下:

//#include "cfun.h"  不需要包含cfun.h
#include "cppfun.h"
#include 
using namespace std;
extern "C"     void cfun(); //聲明為 extern void cfun(); 錯(cuò)誤


void cppfun()
{
    cout<<"this is cpp fun call"<
(2)cfun.h同上  cppfun.cpp 如下:
extern "C"
{
    #include "cfun.h"http://注意include語句一定要單獨(dú)占一行;
}
#include "cppfun.h"
#include 
using namespace std;


void cppfun()
{
    cout<<"this is cpp fun call"<

(3)cfun.h如下:

#ifndef _C_FUN_H_
#define _C_FUN_H_


#ifdef __cplusplus
extern "C"
{
#endif


    void cfun();


#ifdef __cplusplus
}
#endif


#endif

cppfun.cpp如下:

#include "cfun.h"
#include "cppfun.h"
#include 
using namespace std;


void cppfun()
{
    cout<<"this is cpp fun call"<

c調(diào)用c++(關(guān)鍵是C++ 提供一個(gè)符合 C 調(diào)用慣例的函數(shù))

在vs2010上測試時(shí),沒有聲明什么extern等,只在在cfun.c中包含cppfun.h,然后調(diào)用cppfun()也可以編譯運(yùn)行,在gcc下就編譯出錯(cuò),按照c++/c的標(biāo)準(zhǔn)這種做法應(yīng)該是錯(cuò)誤的。以下方法兩種編譯器都可以運(yùn)行

cppfun.h如下:

#ifndef _CPP_FUN_H_
#define _CPP_FUN_H_


extern "C" void cppfun();




#endif

cfun.c如下:

//#include "cppfun.h" //不要包含頭文件,否則編譯出錯(cuò)
#include "cfun.h"
#include 


void cfun()
{
    printf("this is c fun call
");
}


extern void cppfun();


int main()
{
#ifdef __cplusplus
    cfun();
#endif
    cppfun();
    return 0;
}

原文鏈接:https://www.cnblogs.com/TenosDoIt/p/3163621.html





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141607
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50200
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7295

原文標(biāo)題:C 語言里面的 extern "C" ,并沒有那么簡單!

文章出處:【微信號:工程師進(jìn)階筆記,微信公眾號:工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    高質(zhì)量C&;amp;C++

    高質(zhì)量C&;amp;C++
    發(fā)表于 08-16 19:45

    教你如何搭建淺層神經(jīng)網(wǎng)絡(luò)&amp;quot;Hello world&amp;quot;

    作為圖像識別與機(jī)器視覺界的 &quot;hello world!&quot; ,MNIST (&quot;Modified National Institute of Standards and Technology&
    的頭像 發(fā)表于 12-10 18:35 ?1165次閱讀

    基于CNN的惡意軟件加密C&;C通信流量識別方法

    為實(shí)現(xiàn)惡意軟件加密C&;C通信流量的準(zhǔn)確識別,分析正常網(wǎng)頁瀏覽訪問和C&;C通信的htps通信過程,發(fā)現(xiàn)惡意軟件C&;
    發(fā)表于 06-11 14:19 ?7次下載

    51單片機(jī)接收ASCII碼并實(shí)現(xiàn)1602顯示

    []={&amp;apos;0&amp;apos;,&amp;apos;A&amp;apos;,&amp;apos;B&
    發(fā)表于 11-20 20:51 ?23次下載
    51單片機(jī)接收ASCII碼并實(shí)現(xiàn)1602顯示

    &quot;STM32F0 Error: Flash Download failed - &quot;&quot;Cortex-M0&quot;&quot;解決&quot;

    開發(fā)工具CUbemx + Keil uVision5(MDK V5)錯(cuò)誤現(xiàn)象在STM32F0燒錄程序是出現(xiàn)了Error: Flash Download failed - &amp;quot
    發(fā)表于 12-01 12:06 ?34次下載
    &<b class='flag-5'>quot</b>;STM32F0 Error: Flash Download failed  -  &<b class='flag-5'>quot</b>;&<b class='flag-5'>quot</b>;Cortex-M0&<b class='flag-5'>quot</b>;&<b class='flag-5'>quot</b>;解決&<b class='flag-5'>quot</b>;

    芯片工藝的&amp;quot;7nm&amp;quot; 、&amp;quot;5nm&amp;quot;到底指什么?

    近幾年,芯片產(chǎn)業(yè)越來越火熱,一些行業(yè)內(nèi)的術(shù)語大家也聽得比較多了。那么工藝節(jié)點(diǎn)、制程是什么,&quot;7nm&quot; 、&quot;5nm&quot;又是指什么?
    的頭像 發(fā)表于 07-28 17:34 ?1.1w次閱讀
    芯片工藝的&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;7nm&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>; 、&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;5nm&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;到底指什么?

    科沃斯掃地機(jī)器人通過TüV萊茵&amp;quot;防纏繞&amp;quot;和&amp;quot;高效邊角清潔&amp;quot;認(rèn)證

    3月15日,在2024中國家電及消費(fèi)電子博覽會(AWE)上,國際獨(dú)立第三方檢測、檢驗(yàn)和認(rèn)證機(jī)構(gòu)德國萊茵TüV大中華區(qū)(簡稱&quot;TüV萊茵&quot;)為科沃斯兩款掃地機(jī)器人(型號:DDX14、DDX11)
    的頭像 發(fā)表于 03-17 10:49 ?1274次閱讀

    全方位精準(zhǔn)測量技術(shù)助力:中國經(jīng)濟(jì)加力發(fā)展向前&amp;amp;quot;進(jìn)&amp;amp;quot;

    全方位精準(zhǔn)測量技術(shù)助力:中國經(jīng)濟(jì)加力發(fā)展向前&quot;進(jìn)&quot;
    的頭像 發(fā)表于 07-15 09:53 ?701次閱讀
    全方位精準(zhǔn)測量技術(shù)助力:中國經(jīng)濟(jì)加力發(fā)展向前&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;進(jìn)&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    傳統(tǒng)產(chǎn)線VS智能工控:華頡科技如何用模塊化設(shè)計(jì)撕掉&amp;amp;quot;電老虎&amp;amp;quot;標(biāo)簽?

    全球制造業(yè)正迎來&quot;雙碳&quot;戰(zhàn)略下的技術(shù)迭代浪潮,新一代多插槽工控機(jī)憑借模塊化設(shè)計(jì)實(shí)現(xiàn)節(jié)能突破。本文以行業(yè)創(chuàng)新案例為切入點(diǎn),解析智能工控系統(tǒng)如何在硬件架構(gòu)與能源管理領(lǐng)域?qū)崿F(xiàn)雙重進(jìn)化。
    的頭像 發(fā)表于 03-20 17:53 ?471次閱讀
    傳統(tǒng)產(chǎn)線VS智能工控:華頡科技如何用模塊化設(shè)計(jì)撕掉&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;電老虎&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;標(biāo)簽?

    【硬核測評】凌華DAQE雙雄爭霸:工業(yè)數(shù)據(jù)采集界的&amp;amp;quot;速度與激情&amp;amp;quot;實(shí)戰(zhàn)解析

    在汽車碰撞測試的驚險(xiǎn)瞬間,半導(dǎo)體晶圓的微觀世界,甚至是狂風(fēng)呼嘯的風(fēng)力發(fā)電場,一場關(guān)于數(shù)據(jù)采集的&quot;軍備競賽&quot;正在上演。凌華科技推出的DAQE-2010與DAQE-2010(G)這對&quot;黃金搭檔&
    的頭像 發(fā)表于 03-26 15:07 ?370次閱讀
    【硬核測評】凌華DAQE雙雄爭霸:工業(yè)數(shù)據(jù)采集界的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;速度與激情&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;實(shí)戰(zhàn)<b class='flag-5'>解析</b>

    隧道管廊變壓器局放在線監(jiān)測:為地下&amp;amp;quot;電力心臟&amp;amp;quot;裝上智能聽診器

    文章由山東華科信息技術(shù)有限公司提供在城市的地下脈絡(luò)中,隧道管廊承載著電網(wǎng)的&quot;主動(dòng)脈&quot;,而變壓器堪稱其中的&quot;動(dòng)力心臟&quot;。這個(gè)封閉而潮濕的環(huán)境中,變
    的頭像 發(fā)表于 04-09 16:37 ?335次閱讀
    隧道管廊變壓器局放在線監(jiān)測:為地下&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;電力心臟&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;裝上智能聽診器

    電纜局部放電在線監(jiān)測:守護(hù)電網(wǎng)安全的&amp;amp;quot;黑科技&amp;amp;quot;

    文章由山東華科信息技術(shù)有限公司提供在萬家燈火的背后,有一張覆蓋全國的&quot;能源神經(jīng)網(wǎng)絡(luò)&quot;晝夜不息地運(yùn)轉(zhuǎn)。電纜作為電力輸送的&quot;主動(dòng)脈&quot;,其健康狀況直接
    的頭像 發(fā)表于 04-14 18:12 ?316次閱讀
    電纜局部放電在線監(jiān)測:守護(hù)電網(wǎng)安全的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;黑科技&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    倉儲界的&amp;quot;速效救心丸&amp;quot;,Ethercat轉(zhuǎn)PROFINET網(wǎng)關(guān)實(shí)戰(zhàn)案例

    實(shí)戰(zhàn)案例,Ethercat轉(zhuǎn)PROFINET網(wǎng)關(guān),倉儲界的&quot;速效救心丸&quot;
    的頭像 發(fā)表于 05-11 10:32 ?298次閱讀
    倉儲界的&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;速效救心丸&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;,Ethercat轉(zhuǎn)PROFINET網(wǎng)關(guān)實(shí)戰(zhàn)案例

    人形機(jī)器人為什么要定制? ——揭秘工業(yè)場景的&amp;quot;千面需求&amp;quot;

    核心洞察:標(biāo)準(zhǔn)化機(jī)器人難以破解工業(yè)場景的&quot;需求碎片化&quot;困局。富唯智能通過?&quot;五大模塊柔性架構(gòu)+零代碼中樞&quot;?,為?人形機(jī)器人為什么要定制?提供了
    的頭像 發(fā)表于 06-10 17:19 ?299次閱讀
    人形機(jī)器人為什么要定制? ——揭秘工業(yè)場景的&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;千面需求&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    為什么GNSS/INS組合被譽(yù)為導(dǎo)航界的&amp;amp;quot;黃金搭檔&amp;amp;quot;?

    在導(dǎo)航技術(shù)領(lǐng)域,GNSS(全球?qū)Ш叫l(wèi)星系統(tǒng))和INS(慣性導(dǎo)航系統(tǒng))的結(jié)合,一直被業(yè)界譽(yù)為&quot;黃金搭檔&quot;。它們優(yōu)勢互補(bǔ),克服了單一系統(tǒng)的局限性,為高精度、高可靠性的導(dǎo)航提供了完美
    的頭像 發(fā)表于 07-09 17:12 ?159次閱讀
    為什么GNSS/INS組合被譽(yù)為導(dǎo)航界的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;黃金搭檔&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;?