當前位置:首頁 » 編程軟體 » opus編譯

opus編譯

發布時間: 2022-05-04 17:51:51

Ⅰ 「宏」的問題


[編輯本段]一.計算機中的「宏」

什麼是宏

計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。Excel 辦公軟體自動集成了「VBA」高級程序語言,用此語言編制出的程序就叫「宏」。使用「VBA」需要有一定的編程基礎和耗費大量的時間,因此,絕大多數的使用者僅使用了Excel的一般製表功能,很少使用到「VBA」。
解釋器或編譯器在遇到宏時會自動進行這一模式替換。對於編譯語言,宏展開在編譯時發生,進行宏展開的工具常被稱為宏展開器。宏這一術語也常常被用於許多類似的環境中,它們是源自宏展開的概念,這包括鍵盤宏和宏語言。絕大多數情況下,使用「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
宏的用途在於自動化頻繁使用的序列或者是獲得一種更強大的抽象能力--但這常常是一回事。
計算機語言如C或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C 程序員可以獲得更精巧的宏。
Lisp類語言如Common Lisp和Scheme有更精巧的宏系統: 宏的行為如同是函數對自身程序文本的變形,並且可以應用全部語言來表達這種變形。一個C宏可以定義一段語法的替換,然而一個Lisp的宏卻可以控制一節代碼的計算。
獲得了控制代碼的執行順序(見惰性計算和非限制函數)的能力,使得新創建的語法結構與語言內建的語法結構不可區分。例如,一種Lisp 方言有 cond 而沒有if ,就可以使用宏由前者定義後者。Lisp 語法的去部主要擴展,比如面向對象的CLOS 系統,可以由宏來定義。

宏的典型應用

加速日常編輯和格式設置
組合多個命令
使對話框中的選項更易於訪問
使一系列復雜的任務自動執行

宏編程介紹

在用一種不熟悉的宏語言進行宏編程時,可以這樣做,首先記錄下用戶想要宏完成什麼,然後打開宏文件並嘗試理解命令結構如何工作。也可以修改命令以調整宏。一些宏語言,比如Great Plains賬務(?accounting)軟體的 Dexterity 運行時引擎,不能從其它數據源(如由逗號分隔的文本文件)導入數據。這一限制可以通過用更強大的編程語言,如 VBA 來創建一個計算機程序在此弱編程語言里生成一個特別的宏來解決。例如,可以對 Microsoft Excel 宏編程從擴展樣式表或文本文件中讀取數據並創建 Great Plains .mac 文件,這一文件被用於將特定的數據導入 Great Plains. 需要針對每一個新的數據集合聲稱新的 .mac 文件。

鍵盤宏

鍵盤宏和編輯器宏分別在圖形用戶界面和編輯器中被互動式地使用。使用它們可以用簡短的擊鍵代替冗長的命令序列,並為重復性任務提供了一個簡單的自動化形式。
程序員的文本編輯器 Emacs (「編輯宏」[Editing MACroS]的簡稱)是沿用這一思想的產物。事實上,大多數編輯器是由宏組成的,Emacs 最初被設計為編輯語言 TECO 的宏集,後被移植為 Lisp 的一中方言 Emacs Lisp。

宏語言

宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如,
C preprocessor C 預處理器
Internet Macros(iOpus)
M4(如前所述,源於AT&T,捆綁於Unix)
宏定義
c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為:
#define 標志符(參數表) 字元串
宏名
在上定義中的標志符被稱為「宏名」。
宏展開
在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。

微軟Word和宏病毒

Visual Basic for Applications (VBA),是 Microsoft Office 里的一種編程語言. 但由上面的定義,它完全不是一種宏語言。然而,它的功能已經從中發展並最終替代了用戶應用程序的宏思想,所以他被廣泛地錯誤地稱為是一種宏語言。
VBA 可以訪問許多操作系統函數並支持文檔打開時自動執行宏。這使得用這種語言寫計算機病毒成為可能。1990年代中後期,宏病毒成為了最流行的計算機病毒類型之一。其它的包括宏語言的項目,如openoffice.org,故意從其宏語言中排除了一些功能(如:自動執行)以避免破壞程序。然而,這一特性在很多事務中受到歡迎。
[編輯本段]二.漢字:宏
宏 #hóng
【釋義】①廣大;廣博:宏大|宏偉|寬宏大量。②姓。
【宏大】 #hóngdà 宏偉巨大。
〖例句〗小強立下了宏大的志願,要為將來成為一名出色的建築工程師努力學習。
【宏圖】 #hóngtú 遠大的設想,宏偉的計劃。
〖例句〗國家希望在海外留學完成學業的人回國,為實現祖國的宏圖大業貢獻力量。
【宏偉】 #hóngwěi 氣勢雄壯,規模盛大。
〖例句〗宏偉的人民英雄紀念碑矗立在天安門廣場中央。
===================關於這個字的更多的信息=================
宏〈形〉
(形聲。從宀,表示與家室房屋有關,厷聲。本義:屋子寬大而深)
同本義
宏,屋深響也。――《說文》。段玉裁注:「屋深也。各本深下衍響字,此因下文『屋響』而誤,今依《韻會》、《集韻》、《類篇》正。…屋深者,其內深廣也。」
宏我邦我家。――《毛公鼎》
宏,按:深大之屋凡聲如有應響。――清·朱駿聲《說文通訓定聲》
大;宏大
宏,大也。――《爾雅·釋詁》
若保宏父。――《書·酒誥》
舉其宏綱。――《書·序》
其器宏以弇。――《呂氏春秋·孟冬》
又如:宏才(大才);宏碩(大儒碩學。指有學問的人);宏
宏hóng廣大,廣博:~大。~觀。~量。~圖。~偉。寬~。
鄭碼:WDGZ,U:5B8F,GBK:BAEA (5) 筆畫數:7,部首:宀,筆順編號:4451354

Ⅱ 宏定義c語言是什麼意思

在C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。

C語言中,預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,並對源代碼進行相應的轉換,預處理過程還會刪除程序中的注釋和多餘的空白符號。

預處理指令是以#開頭的代碼行,#必須是該行除了空白字元外的第一個字元。#後是指令關鍵字,在#和指令關鍵字之間允許存在若干空白字元。

宏的用途

在於自動化頻繁使用的序列或者是獲得一種更強大的抽象能力。

計算機語言如C語言或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。

Lisp類語言如Common Lisp和Scheme有更精巧的宏系統:宏的行為如同是函數對自身程序文本的變形,並且可以應用全部語言來表達這種變形。一個C宏可以定義一段語法的替換,然而一個Lisp的宏卻可以控制一節代碼的計算。

以上內容參考:網路-宏定義

Ⅲ u盤里多了.fseventsd,.Spotlight-V100,.Trashes三個文件夾 怎麼刪都刪不掉

SparkleShare 是一個開源的基於 Git 的 Dropbox 風格的文件共享應用程序。在我們的系列文章中了解有關 Git 鮮為人知的用法。-- Seth Kenlon(作者)

Git 是一個少有的能將如此多的現代計算封裝到一個程序之中的應用程序,它可以用作許多其他應用程序的計算引擎。雖然它以跟蹤軟體開發中的源代碼更改而聞名,但它還有許多其他用途,可以讓你的生活更輕松、更有條理。在這個 Git 系列中,我們將分享七種鮮為人知的使用 Git 的方法。

今天,我們將看看 SparkleShare,它使用 Git 作為文件共享的基礎。

用於文件共享的 Git

Git 的優點之一是它具有固有的分發能力。它可用來建立共享。即使你只是與自己網路上的其他計算機共享資源庫,Git 也會為從共享位置獲取文件的行為帶來透明性。

隨著其界面的發展,Git 變得非常簡單。雖然因用戶而異,他們坐下來完成一些工作時的共同點僅僅是 git pull 或稍微復雜一點的 git pull && git checkout -b my-branch。但是,對於某些人來說,將命令輸入到他們的計算機中的做法完全是令人困惑或煩惱的。計算機旨在使生活變得輕松,它擅長於重復性工作,因此有更簡便的方法可以與 Git 共享文件。

SparkleShare

SparkleShare 項目是一個基於 Git 的跨平台的、開源的 Dropbox 式的文件共享應用程序。它通過將文件拖放到專門指定的 SparkleShare 目錄中的簡單操作,自動執行所有 Git 命令,觸發添加、提交、推送和拉取過程。因為它基於 Git,所以你可以獲得基於差異(diff)的快速推送和拉取,並且繼承了 Git 版本控制和後端基礎設施(如 Git 掛鉤)的所有優點。它可以完全自託管,也可以將其與 GitLab 、GitHub、Bitbucket 等 Git 託管服務一起使用。此外,由於它基本上只是一個 Git 的前端,因此你可以在可能沒有 SparkleShare 客戶端但有 Git 客戶端的設備上訪問 SparkleShare 中的文件。

正如你獲得 Git 的所有好處一樣,你也會受到所有常見的 Git 限制:使用 SparkleShare 存儲數百張照片、音樂和視頻是不切實際的,因為 Git 是為文本而設計和優化的。Git 當然可以存儲二進制文件的大文件,但是因為它可以跟蹤歷史記錄,因此一旦將文件添加到其中,幾乎就不可能完全刪除它。這在某種程度上限制了 SparkleShare 對某些人的實用性,但使其非常適合許多工作流程,包括 日程安排 。

安裝 SparkleShare

SparkleShare 是跨平台的,可從 網站 獲得適用於 Windows 和 Mac 的安裝程序。對於 linux,有一個 Flatpak 安裝包,或者你可以在終端中運行以下命令:

$ sudo flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo
$ sudo flatpak install flathub org.sparkleshare.SparkleShare
創建一個 Git 存儲庫

SparkleShare 並不是軟體即服務(SaaS)。你在計算機上運行 SparkleShare 與 Git 存儲庫進行通信,而 SparkleShare 並不存儲你的數據。如果你還沒有與文件夾同步的 Git 存儲庫,則必須在啟動 SparkleShare 之前創建一個文件夾。你有三個選擇:託管的 Git、自託管 Git 或自託管 SparkleShare。

託管的 Git

SparkleShare 可以使用你能訪問的任何 Git 存儲庫進行存儲,因此,如果你擁有 GitLab 或任何其他託管服務的帳戶(或創建一個),則它可以成為 SparkleShare 的後端。例如,開源 Notabug.org 服務是一個類似於 GitHub 和 GitLab 的 Git 託管服務,但其獨特性足以證明 SparkleShare 的靈活性。根據用戶界面的不同,不同的託管服務創建新存儲庫的方法也有所不同,但是所有主要存儲庫都遵循相同的通用模型。

首先,在託管服務中找到創建新項目或存儲庫的按鈕,單擊它以開始。然後逐步完成存儲庫的創建過程,為存儲庫提供名稱、隱私級別(存儲庫通常默認為公共),以及是否使用 README 文件初始化存儲庫。無論你是否需要個 README 文件,請初始化建立一個。使用一個文件來創建存儲庫不是絕對必要的,但是它會強制 Git 主機實例化存儲庫中的 master 分支,這有助於確保前端應用程序(例如 SparkleShare)具有要提交並推送的分支。即使文件是幾乎空的 README 文件,也可以用來查看該文件以確認你已連接成功。

Creating a Git repository

創建存儲庫後,獲取其用於 SSH 克隆的 URL。就像從 Git 項目獲得其 URL 一樣,你也可以獲取此 URL:導航至存儲庫頁面並查找 「Clone」 按鈕或欄位。

GitHub 的克隆 URL。

GitLab 的克隆 URL。

這是 SparkleShare 用於獲取數據的地址,因此請記下它。你的 Git 存儲庫現已配置好。

自託管的 Git

你可以使用 SparkleShare 訪問你有權訪問的任何計算機上的 Git 存儲庫。除了一個 Git 裸存儲庫外,無需任何特殊設置。但是,如果你想將對 Git 存儲庫的訪問權授予其他任何人,則應運行 Gitolite 之類的 Git 管理器或 SparkleShare 自己的 Dazzle 伺服器來幫助你管理 SSH 密鑰和帳戶。至少,創建一個特定於 Git 的用戶,以便有權訪問你的 Git 存儲庫的用戶不會自動獲得對伺服器其餘部分的訪問許可權。

以 Git 用戶身份登錄伺服器(如果你非常擅長管理用戶和組許可權,則可以以自己的用戶登錄)並創建存儲庫:

$ mkdir ~/sparkly.git
$ cd ~/sparkly.git
$ git init --bare .
你的 Git 存儲庫現已配置好。

Dazzle

SparkleShare 的開發人員提供了一個名為 Dazzle 的 Git 管理系統,以幫助你自託管 Git 存儲庫。

在你的伺服器上,將 Dazzle 應用程序下載到你的路徑中的某個位置:

$ curl https://raw.githubusercontent.com/hbons/Dazzle/master/dazzle.sh --output ~/bin/dazzle
$ chmod +x ~/bin/dazzle
Dazzle 設置了一個特定於 Git 和 SparkleShare 的用戶,並且還基於 SparkleShare 應用程序生成的密鑰實現了訪問許可權。現在,只需設置一個項目:

$ dazzle create sparkly
你的伺服器現在已經配置好,可以用作 SparkleShare 託管了。

配置 SparkleShare

首次啟動 SparkleShare 時,系統會提示你配置 SparkleShare 用於存儲的伺服器。這個過程可能看起來像一個首次運行的安裝向導,但實際上是在 SparkleShare 中設置新共享位置的通常過程。與許多共享驅動器應用程序不同,使用 SparkleShare 可以一次配置多個位置。你配置的第一個共享位置並不比你以後可以配置的任何共享位置更重要,並且你也不用注冊 SparkleShare 或任何其他服務。你只是將 SparkleShare 指向 Git 存儲庫,以便它知道如何使第一個 SparkleShare 文件夾保持同步。

在第一個屏幕上,給出一個身份信息,SparkleShare 將在代表你進行的 Git 提交記錄中使用這些信息。你可以使用任何內容,甚至可以使用不代表任何意義的偽造信息。它僅用於提交消息,如果你對審查 Git 後端進程沒有興趣,你可能甚至看不到它們。

下一個屏幕提示你選擇主機類型。如果你使用的是 GitLab、GitHub、Planio 或 Bitbucket,則可以選擇一個適當的。否則,請選擇「自己的伺服器」。

Choosing a Sparkleshare host

在此屏幕底部,你必須輸入 SSH 的克隆 URL。如果你是自託管的 Git,則地址類似於 <ssh://[email protected]>,而遠程路徑是為此目的而創建的 Git 存儲庫的絕對路徑。

根據上面的自託管示例,我虛構的伺服器的地址為 ssh://[email protected]:22122(:22122 表示一個非標準的 SSH 埠),遠程路徑為 /home/git/sparkly.git。

如果我改用 Notabug.org 帳戶,則上例中的地址為 ssh://[email protected],路徑為 seth/sparkly.git。

SparkleShare 首次嘗試連接到主機時會失敗,因為你尚未將 SparkleShare 客戶端 ID(特定於 SparkleShare 應用程序的 SSH 密鑰)復制到 Git 主機。這是預料之中的,所以不要取消該過程。將 SparkleShare 設置窗口保持打開狀態,並從系統任務欄中的 SparkleShare 圖標處獲取客戶端 ID。然後將客戶端 ID 復制到剪貼板,以便可以將其添加到 Git 主機。

Getting the client ID from Sparkleshare

將你的客戶端 ID 添加到託管的 Git 帳戶

除了較小的 UI 差異外,在任何託管服務上添加 SSH 密鑰(所有客戶端 ID 都是這樣)的過程基本上是相同的。在你的 Git 主機的 Web 儀錶板中,導航到你的用戶設置,然後找到 「SSH 密鑰」類別。單擊「添加新密鑰」按鈕(或類似按鈕),然後粘貼你的 SparkleShare 客戶端 ID 的內容。

Adding an SSH key

保存密鑰。如果你希望其他人(例如協作者或家庭成員)能夠訪問同一存儲庫,則他們必須向你提供其 SparkleShare 客戶端 ID,以便你可以將其添加到帳戶中。

將你的客戶端 ID 添加到自託管的 Git 帳戶

SparkleShare 客戶端 ID 只是一個 SSH 密鑰,因此將其復制並粘貼到 Git 用戶的 ~/.ssh/authorized_keys 文件中。

使用 Dazzle 添加你的客戶 ID

如果你使用 Dazzle 管理 SparkleShare 項目,請使用以下命令添加客戶端 ID:

$ dazzle link
當 Dazzle 提示你輸入該 ID 時,請粘貼在 SparkleShare 菜單中找到的客戶端 ID。

使用 SparkleShare

將客戶端 ID 添加到 Git 主機後,在 SparkleShare 窗口中單擊「重試」按鈕以完成設置。克隆存儲庫完成後,你可以關閉 SparkleShare 設置窗口,並在你的家目錄中找到一個新的 SparkleShare 文件夾。如果你設置了帶有託管服務的 Git 存儲庫,並選擇包括 README 文件或許可證文件,則可以在 SparkleShare 目錄中看到它們。

Sparkleshare file manager

此外,有一些隱藏目錄,你可以通過在文件管理器中顯示隱藏目錄來查看。

Showing hidden files in GNOME

使用 SparkleShare 的方式與使用計算機上任何目錄的方式相同:將文件放入其中。每當將文件或目錄放入 SparkleShare 文件夾時,它都會在後台復制到你的 Git 存儲庫。

排除某些文件

由於 Git 從設計上就是要記住一切,因此你可能希望從記錄中排除特定的文件類型。排除一些文件是有原因的。通過定義擺脫 SparkleShare 管理的文件,可以避免意外復制大文件。你還可以為自己設計一種方案,使你可以將存儲在一個目錄中的邏輯上屬於同一個文件(例如,MIDI 文件及其 .flac 導出文件),但是可以自己手動備份大文件,而同時讓 SparkleShare 備份基於文本的文件。

如果在系統的文件管理器中看不到隱藏的文件,請顯示它們。導航到你的 SparkleShare 文件夾,然後到代表你的存儲庫的目錄,找到一個名為 .gitignore 的文件,然後在文本編輯器中將其打開。你可以在 .gitignore 中輸入文件擴展名或文件名(每行一個),任何與你列出的文件匹配的文件都會被忽略(如文件名所示)。

Thumbs.db
$RECYCLE.BIN/
.DS_Store
._*
.fseventsd
.Spotlight-V100
.Trashes
.directory
.Trash-*
*.wav
*.ogg
*.flac
*.mp3
*.m4a
*.opus
*.jpg
*.png
*.mp4
*.mov
*.mkv
*.avi
*.pdf
*.djvu
*.epub
*.od{s,t}
*.cbz
你知道最經常遇到哪些文件類型,因此請集中精力處理最有可能潛入你的 SparkleShare 目錄的文件。如果你想稍微矯枉過正一些,可以在 Notabug.org 以及整個網上找到 .gitignore 文件的好集合。

通過將這些條目保存在 .gitignore 文件中,你可以將不需要發送到 Git 主機的大文件放在 SparkleShare 目錄中,SparkleShare 將完全忽略它們。當然,這意味著你需要確保它們可以備份或通過其他方式分發給你的 SparkleShare 協作者。

自動化

自動化 是我們與計算機達成的默契之一:計算機執行重復的、無聊的工作,而我們人類要麼不擅長做這些,要麼不擅長記憶這些。SparkleShare 是一種很好的、簡單的自動執行例行數據分發的方法。但不管怎麼說,這並不適合每個 Git 存儲庫。它沒有用於高級 Git 功能的介面,它沒有暫停按鈕或手動管理的操作。沒關系,因為它的使用范圍是有意限制的。SparkleShare 可以完成它計劃要做的事情,它做得很好,而且它是你無需關心的一個 Git 存儲庫。

如果你想使用這種穩定的、看不見的自動化,請嘗試一下 SparkleShare。

via: https://opensource.com/article/19/4/file-sharing-git

作者: Seth Kenlon 選題: lujun9972 譯者: wxy 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出

Ⅳ C語言中,宏替換的替換規則

簡單來說:宏定義又稱為宏代換、宏替換,簡稱「宏」。宏替換是C/C++的預處理中的一部分,在C++標准中有4條規則來定義替換。

規則1:實參替換。

本條規則描述帶參數的宏的替換過程。

對於宏定義中的形參,在替換列表中,如果不是作為#或##的操作數,那麼將對應實參完全

展開(相當於對實參進行求值),然後將替換列表中的形參替換掉.如果是#或##的操作數,

那麼不進行替換。

規則2:多次掃描。

在所有的形參替換為實參後,對結果進行再次掃描,如果發現還有可替換的宏,則進行替換,

否則中止。

規則3:遞歸替換抑制。

如果在替換列表中發現當前正在展開的宏的名字,那麼這里不進行替換.更進一步,在嵌套

的替換過程中發現已經替換過的宏的名字,則不進行替換。

規則4:遞歸預處理抑制。

如果替換後的結果形成預處理指令,則不執行這條預處理指令。

看幾個C++標准中的例子:

#define x 3

#define f(a) f(x * (a))

#undef x

#define x 2

#define g f

#define z z[0]

#define h g(~

#define m(a) a(w)

#define w 0,1

#define t(a) a

f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);

g(x+(3,4)-w) | h 5) & m(f)^m(m);

其結果分別是

f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);

f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) & f(2 * (0,1))^m(0,1);

對於第一個,主要在於t(t(g)(0) + t)(1)的展開。

容易計算出最外層的t的實參是f(2 * (0)) + t,而作為t的參數傳入時其中的t是

正在被展開的宏,所以根據規則3,不對這個t進行處理,保持不變,得到f(2 * (0)) + t(1)。

對於第二個,h 5)被替換為g(~5),應用規則2,被替換為f(2 * ( ~ 5))。

而m(m)首先被替換為m(w),然後應用規則2再次進行替換,但是m已經是替換過的了,所以保持

不變,只對w進行替換。

#define str(s) # s

#define xstr(s) str(s)

#define debug(s, t) printf("x" # s "= %d, x" # t "= %s",

x ## s, x ## t)

#define INCFILE(n) vers ## n /* from previous #include example */

#define glue(a, b) a ## b

#define xglue(a, b) glue(a, b)

#define HIGHLOW "hello"

#define LOW LOW ", world"

debug(1, 2);

fputs(str(strncmp("abcd", "abc", 』4』) /* this goes away */

== 0) str(: @ ), s);

#include xstr(INCFILE(2).h)

glue(HIGH, LOW);

xglue(HIGH, LOW)

其結果分別是

printf("x" "1" "= %d, x" "2" "= %s", x1, x2);

fputs("strncmp("abc\0d", "abc", 』\4』) = = 0" ": @ ", s);

#include "vers2.h"

"hello";

"hello" ", world"

關鍵是glue和xglue.

對於glue(HIGH, LOW),首先有一個規則1的抑制,得到HIGHLOW;的結果,然後二次掃描,得到

"hello";

對於xglue(HIGH, LOW)沒有抑制效果,所以對參數求值,分別得到HIGH和LOW ", world",即

glue(HIGH, LOW ", world")。

然後進行連接操作得到HIGHLOW ", world",最後再掃描一次得到"hello" ", world"

如果考慮字元串的自然的連接,就可以得到"hello, world"了。

(4)opus編譯擴展閱讀

宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如, C preprocessor C預處理器Internet Macros(iOpus) M4(如前所述,源於AT&T,捆綁於Unix)

宏定義

c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為:

#define標志符[(參數表)] 字元串

宏名

在上定義中的標志符被稱為「宏名」。

宏展開

在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。

宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用, 但在文本處理程序中應用普遍。例如,

C preprocessorC 預處理器

Internet Macros(iOpus)

M4(如前所述,源於AT&T,捆綁於Unix)

Ⅳ 計算機中出現的宏設置是什麼意思

計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。Excel 辦公軟體自動集成了「VBA」高級程序語言,用此語言編制出的程序就叫「宏」。使用「VBA」需要有一定的編程基礎和耗費大量的時間,因此,絕大多數的使用者僅使用了Excel的一般製表功能,很少使用到「VBA」。 解釋器或編譯器在遇到宏時會自動進行這一模式替換。對於編譯語言,宏展開在編譯時發生,進行宏展開的工具常被稱為宏展開器。宏這一術語也常常被用於許多類似的環境中,它們是源自宏展開的概念,這包括鍵盤宏和宏語言。絕大多數情況下,使用「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。 宏的用途在於自動化頻繁使用的序列或者是獲得一種更強大的抽象能力--但這常常是一回事。 計算機語言如C或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C 程序員可以獲得更精巧的宏。 Lisp類語言如Common Lisp和Scheme有更精巧的宏系統: 宏的行為如同是函數對自身程序文本的變形,並且可以應用全部語言來表達這種變形。一個C宏可以定義一段語法的替換,然而一個Lisp的宏卻可以控制一節代碼的計算。 獲得了控制代碼的執行順序(見惰性計算和非限制函數)的能力,使得新創建的語法結構與語言內建的語法結構不可區分。例如,一種Lisp 方言有 cond 而沒有if ,就可以使用宏由前者定義後者。Lisp 語法的去部主要擴展,比如面向對象的CLOS 系統,可以由宏來定義。 宏的典型應用 加速日常編輯和格式設置 組合多個命令 使對話框中的選項更易於訪問 使一系列復雜的任務自動執行 宏編程介紹 在用一種不熟悉的宏語言進行宏編程時,可以這樣做,首先記錄下用戶想要宏完成什麼,然後打開宏文件並嘗試理解命令結構如何工作。也可以修改命令以調整宏。一些宏語言,比如Great Plains賬務(?accounting)軟體的 Dexterity 運行時引擎,不能從其它數據源(如由逗號分隔的文本文件)導入數據。這一限制可以通過用更強大的編程語言,如 VBA 來創建一個計算機程序在此弱編程語言里生成一個特別的宏來解決。例如,可以對 Microsoft Excel 宏編程從擴展樣式表或文本文件中讀取數據並創建 Great Plains .mac 文件,這一文件被用於將特定的數據導入 Great Plains. 需要針對每一個新的數據集合聲稱新的 .mac 文件。 鍵盤宏 鍵盤宏和編輯器宏分別在圖形用戶界面和編輯器中被互動式地使用。使用它們可以用簡短的擊鍵代替冗長的命令序列,並為重復性任務提供了一個簡單的自動化形式。 程序員的文本編輯器 Emacs (「編輯宏」[Editing MACroS]的簡稱)是沿用這一思想的產物。事實上,大多數編輯器是由宏組成的,Emacs 最初被設計為編輯語言 TECO 的宏集,後被移植為 Lisp 的一中方言 Emacs Lisp。 宏語言 宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如, C preprocessor C 預處理器 Internet Macros(iOpus) M4(如前所述,源於AT&T,捆綁於Unix) 宏定義 c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為: #define 標志符(參數表) 字元串 宏名 在上定義中的標志符被稱為「宏名」。 宏展開 在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。 微軟Word和宏病毒 Visual Basic for Applications (VBA),是 Microsoft Office 里的一種編程語言. 但由上面的定義,它完全不是一種宏語言。然而,它的功能已經從中發展並最終替代了用戶應用程序的宏思想,所以他被廣泛地錯誤地稱為是一種宏語言。 VBA 可以訪問許多操作系統函數並支持文檔打開時自動執行宏。這使得用這種語言寫計算機病毒成為可能。1990年代中後期,宏病毒成為了最流行的計算機病毒類型之一。其它的包括宏語言的項目,如openoffice.org,故意從其宏語言中排除了一些功能(如:自動執行)以避免破壞程序。然而,這一特性在很多事務中受到歡迎。

Ⅵ linux下編譯ffmpeg時關於configure的問題.

你准備工作沒做好吧!!

  1. 先編譯安裝Yasm。

  2. 然後編譯安裝H.264 (也就是x264)。

  3. 再編譯安裝AAC audio encoder (fdk-aac)。

  4. 編譯安裝libmp3lame (MP3 audio encoder)。

  5. 編譯安裝libopus (Opus audio decoder and encoder)。

  6. 編譯安裝libvpx (VP8/VP9 video encoder and decoder)。

  7. 做後編譯安裝ffmpeg。

    其中1-6你可以選擇編譯安裝,也可以使用源直接安裝。安裝後了再編譯安裝ffmpeg

    你使用 sudo ldconfig -p |grep libx264 看看你的libx264是否正確安裝.

    你編譯安裝x264的時候可以使用2中方式都安裝。

cd ../x264

./configure --enable-shared
make
make install

最後

cd ../x264
make distclean
./configure --enable-static
make
make install

Ⅶ 張汝倫的抄襲事件

針對復旦大學教授張汝倫的專著《歷史與實踐》,孫周興教授在《中華讀書報》(2000 年3月29日)發表評論——《實踐哲學的悲哀》:稱該書「並不是張汝倫教授的『著作』 ,而是一本『譯作』,或者充其量也只能說張汝倫教授『編譯』的」,因而《歷史與實踐》是「偽書」、張是「文抄公」。
為了「不負孫教授的苦心,亦為《歷史與實踐》的讀者負責」,張汝倫教授發表《批評的悲哀》(註:《中華讀書報》2000年3月29日。):稱其書「主題極為突出,無論在內容、風格和目的上都與《哲學歷史詞典》有極大的不同」,而且「除了『實踐概念和實踐哲學』這一節引用了《哲學歷史詞典》的一些材料外,《歷史與實踐》與《哲學歷史詞典》沒有任何關系」。在他看來,其《歷史與實踐》「有著明確的主題、完整的結構和一以貫之的思路和線索。正是這些使所謂它是一部『偽書』的指控不攻自破」。而孫「真正目的是僅僅根據那幾頁來自《哲學歷史詞典》的材料沒有註明出處,來一口咬定這本書是抄自該詞典。其想像也未免太大膽了一些,但卻忘了小心求證。《歷史與實踐》共487頁,要證明它抄自《哲學歷史詞典》,僅靠他目前提供的那點證據是遠遠不夠的。即使是他提到的第103~105頁的內容,要證明它出自《哲學歷史詞典》或其他任何一本書,我想他也是絕對辦不到的,更不用說本書的其他部分了。孫教授……缺乏足夠的證據就一口咬定《歷史與實踐》一書是抄自《哲學歷史詞典》,這就不是批評,而是誣陷和誹謗了。而誣陷和誹謗就不僅僅是一個道德問題了」。
很顯然,在上述回應中,張汝倫教授既沒有絲毫的自我批評,也沒有對孫教授認定的《歷史與實踐》第98~102頁抄自《哲學歷史詞典》的批評有任何認錯的表示。張教授盡管無奈中遮遮掩掩地表示「『實踐概念和實踐哲學』這一節引用了《哲學歷史詞典》的一些材料」,但他強調的還是已經「把自己的東西和別人的東西分得很清楚了」。如此一來,逼得孫周興教授只好在《悲哀復悲哀》中繼續揭發、再證《歷史與實踐》的抄襲性質:「經本人對張汝倫教授的『專著』《歷史與實踐》第96~105頁與德文版《哲學歷史詞典》第七卷中『實踐、實踐的』條目所作的仔細對照,現已查明,其中有7頁文字(第96~102頁,其餘3頁性質不明),加上這7頁中出現的32個注釋,完完全全是從上述《詞典》條目中抄襲下來的,其中沒有一個句子是屬於張汝倫教授自己的……我斷定:張汝倫教授的《歷史與實踐》具有抄襲性質,是一部偽書。而且我斷定:這種把《詞典》條目正文連同注釋不加修飾地照抄下來的做法,決非出於無意和疏忽,而是一種蓄意的剽竊行為。」
孫周興先生原為浙江大學教授,現任同濟大學教授,以研究海德格爾著稱。他說:「 我與張汝倫教授是熟識的同行,既沒有個人恩怨,也沒有發生過學術上的爭論。」「在我的印象當中,張汝倫是一位嚴肅的學者,在學術上經常表現出凜然不可犯的樣子,學風應該是正派的。」張汝倫先生是復旦大學哲學系的名牌教授,不僅搞西方現代哲學,而且也出了大部頭的中國現代哲學專書。只是張教授不夠愛惜自己,倒了牌子,砸了形象,盡管他仍在復旦大學繼續當教授和博士生導師。
因為在張汝倫教授出事之前,已有中文系申小龍教授抄襲在先,繼之有哲學系佘碧平副教授剽竊在後,還有歷史系已通過答辯的某博士學位論文被發現存在大量抄襲的問題,故他們工作的大學曾一度被風趣的網友給幽默為「復印大學」。其實,與其說是幽默,毋寧說是無奈、痛心、心酸,或者說是「怒其不爭」「恨鐵不成鋼」。
悲哀復悲哀——再證張汝倫《歷史與實踐》的抄襲性質
時間:2001年11月21日
作者:孫周興(浙江大學教授)
來源:原創
關鍵詞:
這是一篇揭露學界醜事的文章
讀了張汝倫教授的文章《批評的悲哀——我對孫周興教授批評的回答》,首先知道自己已得了一個不小的「罪過」:原以為只有「實踐哲學」被張教授弄得比較悲哀了,沒想到因為我那篇揭露他的《歷史與實踐》抄襲真相的文章,中國的「批評」也變得悲哀了。張教授的說法是:國外的批評是「對事不對人」,而國內的批評則是「對人不對事」。不過,張教授應該沒有忘記,對於他的同一本「專著」《歷史與實踐》,我曾撰寫過一篇贊揚性的書評;現在我發現他這本書具有抄襲性質,所以要寫文章予以揭露。張教授,你說我是「對人」還是「對事」?
張教授還在文中說:「客觀公正的批評還牽涉到學者的人品、修養和風度」。意思大概是指責作為批評者的孫周興在「人品、修養和風度」方面大有問題。這話若由旁的人說出來,我還願意聽一聽,然後好好反省一下自己最近的作為;但現在由張汝倫教授來說這個話,我就只覺得有點滑稽了。
為避免被張教授混淆了視聽,看來我還得首先作一次澄清:拙文《實踐哲學的悲哀》(以下簡稱《悲哀》)根本就不是一篇學術批評文章,而是一篇揭露學界醜事的文章(讀者諸君眼下看到的這篇亦屬此類)。學術批評是討論學術問題的,而我現在沒有任何學術問題需要向張教授請教的,其實拙文《悲哀》也沒有涉及任何學術性的問題,而只是向讀者們報道張教授是如何抄襲的。我的主張是:對於學術問題,大家討論時應當而且必須心平氣和,與人為善。而對於學界醜陋現象的揭露,就是另一回事了,擺出事實後,稍稍傳達一點憤怒和譏諷,不但是可以的,而且是必需的。舉個例子說,群眾抓住了一個偷兒,當然是可以、而且是大有必要表達一下憤怒的心情的。
然而,偷兒也有自己的邏輯。群眾憤怒地對偷兒說:喂,你這幾件東西是偷來的!偷兒看看人證物證俱在,就答道:第一、不錯,這幾件東西是人家的,但不是我偷來的,而是「借」來的,只是有一點點對不起了,我忘了從哪裡「借」的,本來我是要跟人家說一聲的;第二、即使這幾件東西是人家的,我這里還有別的幾樣東西,你們知道它們是從哪裡來的嗎?哈哈,我看你們就不知道!所以,我怎麼可能是小偷?!
上帝見諒,我為這段文字猶豫了好幾天,一直想把它刪掉算了,免得張教授生氣,以為我又在存心「諷刺和挖苦」。但讀者諸君,你們如果把張教授的《批評的悲哀》一文總結、提煉一下,就會看到其中的意思差不多也就是上面兩點。更有甚者,在表達了這個意思以後,張教授就壯了膽子,反過來倒打一耙,指責我「誣陷」和「誹謗」他了。我想,這就有點無恥了。
的確,到眼下為止,除了《悲哀》一文所做的以及本文要補充的事實指證外,我還不知道《歷史與實踐》中的「別的東西」是從哪裡來的。因為我已經在《悲哀》一文中明言,我眼下身在德國,手頭只有《歷史與實踐》第96-105頁的復印件。但我認為,我陳述的事實已足以證明《歷史與實踐》的抄襲性質了。張汝倫教授避而不談我舉證的事實,卻振振有詞地要求我拿出更多的「證據」,因為他說這本書一共有487頁——這就接近於我前面講的偷兒的「邏輯」了!
從操作角度上講,張汝倫教授對我提出的這個要求也是不可能實現的。之所以不可能,是因為外文版的哲學圖書和資料浩如煙海,張教授既然抄襲了《哲學歷史詞典》,也就有可能抄其他圖書;而且,倘若我又找出十頁、二十頁來,張教授還是會說:那麼還有其他的呢?這樣推下去,即使我有愚公移山的精神,顯然也是完成不了這項艱巨任務的。
繼續揭發
要做這種全面的對照工作,其實只有一個人能夠勝任——那就是張教授自己,正如只有他清楚地知道,我指證的10頁中有3頁不是從《詞典》中抄來的。也正因此,張教授才敢在文中指責我的證據「其實只涉及從98-102頁等5頁的內容」,並責問道:「其餘5頁的內容既然也可在該條目下找到,為何不一並『揭發』,以正視聽?」
既然張教授這樣問了,我只好答一答。我在寫《悲哀》一文時,因為篇幅的限制,的確沒有從第96頁開始「揭發」,而是從第98頁開始,止於第102頁。到第102頁,覺得文章已經太長,而且證據已經確鑿,就沒有再對照下去。現在聽張教授一說,我對照了一下,確實沒有在《詞典》第七卷相關條目中發現第103頁以下3頁的內容。
但無論如何,張汝倫教授要求我繼續「揭發」的「其餘5頁」中的另外2頁(即第96-97頁)的內容,卻是完完全全在這部詞典上的。既然張教授要求我一並「揭發」出來,我在這里只得把這2頁也補上。
張教授的原文如下:
築,學習或趨向目標和本身即是目的(如生活、幸福、看、沉思和思考)。這些活動就是狹義的「實踐」。亞里士多德用Energeia這個詞來專指這種目標在其本身的實踐。這就把行為與「做」與「生產」區分開來了。實踐是趨向目的的過程和本身就是目的的「行」。《尼各馬可倫理學》雖然使用的術語與《形而上學》有所不同,但基本上仍堅持了這種區分。只不過在《形而上學》中Energeria只是指自身就是目的的行為,而在《尼各馬可倫理學》中實現目的的過程也叫做Energeria。實踐及其對象同時也是人存在表現的全部形式的總稱:既指理論科學,工藝技術和狹義的行為,但另一方面也指有別於理論,工藝的人的活動。(注8)這種三分法對亞里士多德哲學本身以及後世的實踐哲學都有很大的意義。狹義的實踐概念,即我們正在考察的實踐概念由此有了明確的規定和輪廓。[抄自第1281頁]行為就是做決定,行為的對象就是決定的對象。與這種三分法相應,亞里士多德把真理的形式也分為三種,實踐以「實踐的真理」為目標。在試圖從內容上確定通過行為實現的最高的善時,亞里士多德從柏拉圖那裡接受了把生活形式分為理論——哲學生活和公民——政治生活的做法。(注9)不過與後來中世紀翻譯亞里士多德的做法不同的是,亞里士多德把日常生活稱為「政治生活」而不是「實踐生活」。「實踐生活」指的是哲學專門的理論生活方式。[抄自第1282頁]只有Eupragia(正確的行為)才是人的最終目標,而幸福作為所有人實踐的目標本身就是實踐。(注10)實踐在這里既不是生物學或宇宙學意義上的創造運動,也不是單一的行為或活動,更不是生物學的功能,而是正確的行為,即一個完全圓滿的完成,自身構成目的的實踐。這就是作為實踐哲學的核心概念的「實踐」的基本意義。[抄自第1283頁]這種正確的行為,即實踐,與他人和社會的福祉有關,主要是指與生產勞動相區別的人的倫理道德行為和政治行為。然而,理論在最終意義上自身便是目的,故它是最高的實踐。(注11)[抄自第1285頁] 但亞里士多德以後,人們對「實踐」概念的理解卻逐漸狹窄。普羅丁把實踐理解為由向外的趨向造成的行為。(注12)他也像亞里士多德一樣,把最高的活動稱為Energeia。但這不是指實踐,而是指Poiesis(生產)。實踐只是理論的一種派生形式,因為外向的實踐是模仿最高的和第一的Poiesis,它由於自身的弱點不能以自身為目標,而需要向外訴求。「人們在理論上不行,就轉向實踐——理論和邏各斯的影子」。(注13)與亞里士多德相反,不是理論是實踐的形式,而是實踐是理論的形式。實踐只是為了觀察,因為一切實踐都要求回到純理論的特殊起源。[抄自第1286頁]早期中世紀並未接受古希臘的實踐概念,只是通過對亞里士多德的《尼各馬可倫理學》的翻譯詮釋,實踐概念才重新進入歐洲的精神世界。希臘的實踐在拉丁文中被譯為actus,這就使它有了「行動」的意思,並且是與人的意志選擇有關的活動。這是中世紀後期哲學的實踐概念的基本規定。[抄自第1287頁]羅吉爾·培根認為要在一切科學和道德哲學中區分出思辯因素和實踐因素。因為人的活動都是可以進行道德評價的行為,在此意義上理智被稱為「實踐的」,因為它完成實踐,即善或惡的行為。這樣,實踐概念又和道德行為相關了。道德哲學因此和神學一起有一種基礎科學的地位。與這種狹義的實踐相比,其它認識都是思辨的,是為實踐服務的。「一切不教我們善的科學,真正和絕對地看都是思辨的,這就是道德科學之外的一切科學。只有教我們為善的科學才是真正和絕對是實踐的」。(注14)[抄自第1288頁](張汝倫:《歷史與實踐》,第96-98頁)
首先要做兩點說明:一、上列引文開頭的「築」字前面一個字在《歷史與實踐》的第95頁上面,是我目前見不到的,但對照一下德文原文,就可以確定那就是「建」字了,而這也表明第95頁上至少還有一段文字是抄襲的。二、最後一句話已經在98頁上了,緊接著就是張教授抄來的關於鄧·司各特的實踐概念那一段了。
本來我想仍舊按照《悲哀》一文的做法,根據德文原文(《哲學歷史詞典》第七卷第1281-1288頁,原作者為GüntherBien先生)把張教授的文字再譯一遍,但我發現他這里的譯文基本上還是忠實的,再譯實在是多此一舉,所以,我只用黑體字在上列引文中間標明原文的頁碼。張教授在這里的抄襲手段,自然也跟我在《悲哀》中描述的一模一樣:仍舊是把比較難解難譯的句子跳過去,不認識的希臘文詞語和句子就不抄,原文共有51個注釋,他抄下來7個。但上引《歷史與實踐》的兩頁文字,字字句句都在《詞典》裡面,沒有一句是張教授自己寫的!
注釋也是抄來的
關於注釋的抄襲性質,我在拙文《悲哀》中沒有充分舉證,這里需要補一下,以免張汝倫教授又怪我的工作做得不到家。因為《歷史與實踐》做的不是當頁注,所以我見不到他上引兩頁的注釋。但根據德文原文,我就知道張教授抄襲下來的7個注釋是下面這個樣子的:
注8:Aristoteles:Eth.Nic.I,1,1049a1。
注9:Aristoteles:Eth.Nic.I,3,1095b14ff。
注10:Aristoteles:Pol.VII,3,1325a32。 注11:J.Frese:Proze?imHandlungsfeld(1985)32f。
注12:Plotin:Enn.V,3,6,35;IV,4,4;VI,8,6,20。
注13:Plotin:8,4,32。
注14:RogerBacon:MoralisPhilosophia,hg.E.Massa(Zürich1953),249;vgl.auchOpustertium,a.O.13,48。
讀者只要把《歷史與實踐》第二章的注釋部分翻開來對照一下,就會看到其中的第8-14個注就如上列。在這7個注釋當中,注8、注9、注10抄自《詞典》第七卷原文第1285頁上的注31、注36、注42;注12、注13抄自原文第1287頁上的注3、注6;注14抄自原文第1294頁上的注16。最有趣的是注11,張教授抄的竟是人家在注釋中的一個注釋:他把原文第1285頁上的注51中的一句話(「……理論是最高的實踐」)抄了下來,順手就加了一個注,把其中列出的一本參考書標上了!但這回可真把我弄苦了:我在原文正文中反復查找,差點以為這個注終於是張教授「自己的東西」了。
加上我在《悲哀》中舉證過的5頁,在他抄自《詞典》的7頁文字中(《歷史與實踐》第96-102頁),張教授一共抄襲了原文的32個注釋———在我的記憶中,他的注釋都是用外文原文標出的。但他在《批評的悲哀》一文中居然還能說:為了表明他的書是虛心地「聽別人的意見」,所以他就「盡量多加註(全書487頁,共843個注,平均每1頁兩個注)」。從我們舉出的事實看,注釋確實是蠻多的,但不是張教授自己「加」的,而是抄來的。而以這些抄來的注釋為依據的「參考文獻」(其中應有希、拉、德、英、法等多種歐洲語言的書目),當然也是抄來的了。——這還用得著我來證明么?
在《詞典》注釋中出現的書名多半是縮寫的,比如上列注8和注9中的亞里士多德的《尼各馬可倫理學》(Nikomachische Ethik)被縮寫為:Eth.Nic.。上列注12中的Enn.也是普羅丁的Enneades(《九章集》)一書的縮寫。《詞典》中可以縮寫,但在「專著」中就不行了。所以,張教授在抄襲這些注釋時,還不得不做一個從書名縮寫到全名的「恢復」工作。這個工作是夠他煩的!
張教授在《批評的悲哀》一文中為讀者們編造了一個美麗的謊言:他說《歷史與實踐》的「相當一部分內容」其實是他在德國時的「讀書記錄和筆記」,但最初記下來並不是為了出版,而「只是為了自己看」,所以「摘錄、翻譯」都「比較隨意」,後來回國了,「覺得實踐哲學非常重要,而國內對之了解不夠,遂決定在此基礎上成書」;又因為回國以後已經找不到有關圖書了,所以他就沒有註明出處(參看張汝倫:《批評的悲哀》第三段;重點號為引者所加)。根據我上面的舉證,他的這個謊言已經可以不攻自破:要不是從一開始就為了出書而存心剽竊,而只是做一點供自己欣賞的「比較隨意」的「筆記」,張教授又何苦把原文中的這許多個注釋嚴格地一一查對、抄錄下來,並且要做好上述繁瑣的「恢復」工作?
到這里,我要來談談《歷史與實踐》的「後記」了,因為張教授在《批評的悲哀》中主要是用這個「後記」來表明他沒有抄襲。誠如張教授所言,我以前是好好讀過他這個「後記」的,當時卻絲毫沒感覺到它有什麼特別的,自然也沒有體會到它的真正「功能」和「意義」。現在我沒法重溫這個「後記」,但我已從張教授那裡知道了它的巨大威力,因為它把「像這種由於某種原因未註明出處的材料都包括進去了」(張汝倫:《批評的悲哀》第三段。而這也就是說,這個「後記」能夠把張教授在《歷史與實踐》中的抄襲行徑完全「合法化」,能夠把他抄來的別人的文字都占為己有!讀者諸君,你們說這一招厲害不厲害?
看來張教授真是深謀遠慮,早就在抄好書後精心製作了這個「後記」,自以為已經為自己留了一條退路。但我有點懷疑:這能成為一條退路嗎?整頁整頁地抄了人家的文字(論述、引文和注釋)之後,只要在「後記」中說明一下這本書是根據自己的一些讀書「心得和記錄」寫成的,你就可以為自己的抄襲行為辯護了嗎?
如果張教授的這種「邏輯」可以成立,則無論是誰都可以把他的「專著」《歷史與實踐》再「記錄」一遍,然後也寫個「後記」說明是「心得和記錄」,把書名改一下,然後署上無論是誰的大名,就拿去出版好了。這樣做來固然好,但不知道他張教授願意不願意?
抄襲性質不容置疑
好了,讓我來作一個總結,最後把張汝倫教授《歷史與實踐》一書的抄襲事實明確如下:
經本人對張汝倫教授的「專著」《歷史與實踐》第96-105頁與德文版《哲學歷史詞典》第七卷中「實踐、實踐的」條目所作的仔細對照,現已查明,其中有7頁文字(第96-102頁,其餘3頁性質不明),加上這7頁中出現的32個注釋,完完全全是從上述《詞典》條目中抄襲下來的,其中沒有一個句子是屬於張汝倫教授自己的。粗略計算一下,已舉證的正文為7頁,32個注釋以每個至少一行計算,約為1.5頁,此外還有第95頁的部分或全部,暫且摺合為0.5頁(聲明:這是我推斷出來的,因為第96頁上只是亞里士多德實踐概念的後半部分,前半部分必定在第95頁上了),共計9頁。這就是說,僅僅根據對《歷史與實踐》10頁文字的調查,我已經確證張汝倫教授至少抄襲了9頁、6750個漢字(以每頁750個計)。據此事實,我斷定:張汝倫教授的《歷史與實踐》具有抄襲性質,是一部偽書。而且我斷定:這種把《詞典》條目正文連同注釋不加修飾地照抄下來的做法,決非出於無意和疏忽,而是一種蓄意的剽竊行為。
對於這個事實的鑒定工作,我建議可以由國內從事西方哲學研究的同行組成專家小組來完成。根據我新近了解到的情況,北京大學圖書館就有這套德文版的《哲學歷史詞典》,因此完全有條件在國內進行這項鑒定。而對於我基於這個事實所做的斷定,我想請讀者諸君來評論。因為,學術乃天下公器,而群眾的眼睛是雪亮的。

Ⅷ 宏的宏語言

宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如, C preprocessor C預處理器Internet Macros(iOpus) M4(如前所述,源於AT&T,捆綁於Unix)
宏定義
c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為:
#define標志符[(參數表)] 字元串
宏名
在上定義中的標志符被稱為「宏名」。
宏展開
在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。
宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用, 但在文本處理程序中應用普遍。例如,
C preprocessorC 預處理器
Internet Macros(iOpus)
M4(如前所述,源於AT&T,捆綁於Unix)

Ⅸ 電腦軟體中的(宏)功能是什麼

計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。Excel 辦公軟體自動集成了「VBA」高級程序語言,用此語言編制出的程序就叫「宏」。使用「VBA」需要有一定的編程基礎和耗費大量的時間,因此,絕大多數的使用者僅使用了Excel的一般製表功能,很少使用到「VBA」。 解釋器或編譯器在遇到宏時會自動進行這一模式替換。對於編譯語言,宏展開在編譯時發生,進行宏展開的工具常被稱為宏展開器。宏這一術語也常常被用於許多類似的環境中,它們是源自宏展開的概念,這包括鍵盤宏和宏語言。絕大多數情況下,使用「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。 宏的用途在於自動化頻繁使用的序列或者是獲得一種更強大的抽象能力--但這常常是一回事。 計算機語言如C或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C 程序員可以獲得更精巧的宏。 Lisp類語言如Common Lisp和Scheme有更精巧的宏系統: 宏的行為如同是函數對自身程序文本的變形,並且可以應用全部語言來表達這種變形。一個C宏可以定義一段語法的替換,然而一個Lisp的宏卻可以控制一節代碼的計算。 獲得了控制代碼的執行順序(見惰性計算和非限制函數)的能力,使得新創建的語法結構與語言內建的語法結構不可區分。例如,一種Lisp 方言有 cond 而沒有if ,就可以使用宏由前者定義後者。Lisp 語法的去部主要擴展,比如面向對象的CLOS 系統,可以由宏來定義。
宏的典型應用
加速日常編輯和格式設置 組合多個命令 使對話框中的選項更易於訪問 使一系列復雜的任務自動執行
宏編程介紹
在用一種不熟悉的宏語言進行宏編程時,可以這樣做,首先記錄下用戶想要宏完成什麼,然後打開宏文件並嘗試理解命令結構如何工作。也可以修改命令以調整宏。一些宏語言,比如Great Plains賬務(?accounting)軟體的 Dexterity 運行時引擎,不能從其它數據源(如由逗號分隔的文本文件)導入數據。這一限制可以通過用更強大的編程語言,如 VBA 來創建一個計算機程序在此弱編程語言里生成一個特別的宏來解決。例如,可以對 Microsoft Excel 宏編程從擴展樣式表或文本文件中讀取數據並創建 Great Plains .mac 文件,這一文件被用於將特定的數據導入 Great Plains. 需要針對每一個新的數據集合聲稱新的 .mac 文件。
鍵盤宏
鍵盤宏和編輯器宏分別在圖形用戶界面和編輯器中被互動式地使用。使用它們可以用簡短的擊鍵代替冗長的命令序列,並為重復性任務提供了一個簡單的自動化形式。 程序員的文本編輯器 Emacs (「編輯宏」[Editing MACroS]的簡稱)是沿用這一思想的產物。事實上,大多數編輯器是由宏組成的,Emacs 最初被設計為編輯語言 TECO 的宏集,後被移植為 Lisp 的一中方言 Emacs Lisp。
宏語言
宏語言是一類編程語言,其全部或多數計算是由擴展宏完成的。宏語言並未在通用編程中廣泛使用,但在文本處理程序中應用普遍。例如,
C preprocessor C 預處理器 Internet Macros(iOpus) M4(如前所述,源於AT&T,捆綁於Unix) 宏定義 c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為: #define 標志符(參數表) 字元串 宏名 在上定義中的標志符被稱為「宏名」。 宏展開 在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。
微軟Word和宏病毒
Visual Basic for Applications (VBA),是 Microsoft Office 里的一種編程語言. 但由上面的定義,它完全不是一種宏語言。然而,它的功能已經從中發展並最終替代了用戶應用程序的宏思想,所以他被廣泛地錯誤地稱為是一種宏語言。 VBA 可以訪問許多操作系統函數並支持文檔打開時自動執行宏。這使得用這種語言寫計算機病毒成為可能。1990年代中後期,宏病毒成為了最流行的計算機病毒類型之一。其它的包括宏語言的項目,如openoffice.org,故意從其宏語言中排除了一些功能(如:自動執行)以避免破壞程序。然而,這一特性在很多事務中受到歡迎。
望採納!!!

Ⅹ 德律風根opus studio 2650的音頻輸出是什麼插頭

最近項目中用到了語音編碼opus,在網上搜了一下,資料非常少,而且沒有一個完整的教程,現在簡單記錄下來opus的使用方法。

首先介紹一下opus

Opus
Opus編碼器 是一個有損聲音編碼的格式,由互聯網工程任務組(IETF)進來開發,適用於網路上的實時聲音傳輸,標准格式為RFC 6716。Opus 格式是一個開放格式,使用上沒有任何專利或限制。
特性
Opus的前身是celt編碼器。在當今的有損音頻格式爭奪上,擁有眾多不同編碼器的AAC格式打敗了同樣頗有潛力的Musepack、Vorbis等格式,而在Opus格式誕生後,情況似乎不同了。通過諸多的對比測試,低碼率下Opsu完勝曾經優勢明顯的HE AAC,中碼率就已經可以媲敵碼率高出30%左右的AAC格式,而高碼率下更接近原始音頻。
以上來自網路(PS:網路對opus的介紹都很少)

簡單來說,opus是一個高保真的適合在網路中傳輸的開源的語音編碼格式,相對於其他編碼格式來講,保真性更好,但體積會稍微大一些。官網地址:http://www.opus-codec.org/

怎麼用呢?
首先你可以使用編譯好的so庫直接使用,或者也可以使用源碼自己根據需求生成so庫來使用,當然,你也可以直接將源碼使用到自己工程各中,這就是開源的好處。好了下面介紹如何編譯。
我是通過Eclipse來編譯的,首先在opus官網下載源代碼,解壓
編碼工作需要ndk編程所以需要一些NDK編程的知識。
在工程中創建OpusTool類,該類用於調用native層的方法。

[java] view plain
package com.ione.opustool;

public class OpusTool {

public native String nativeGetString();

public native int encode_wav_file(String in_path, String out_path);

public native int decode_opus_file(String in_path, String out_path);
}

其中nativeGetString()方法是用來測試jni調用是否成功的測試方法,encode_wav_file(String in_path, String out_path);和 decode_opus_file(String in_path, String out_path);分別是用來編解碼。以上三個方法均需聲明為native,用來調用jni的c函數。然後在項目根目錄下打開命令行,使用javah命令生成.h文件,即:

javah -classpath .\bin\classes -d jni com.ione.opustool.OpusTool
其中.\bin\classes為指定OpusTool.class的路徑,-d jni為在當前目錄下生成jni文件夾,用來存放native層代碼。回車之後便在工程的根目錄下生成了jni文件夾以及com_ione_opustool_OpusTool.h文件。如:

[cpp] view plain
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ione_opustool_OpusTool */

#ifndef _Included_com_ione_opustool_OpusTool
#define _Included_com_ione_opustool_OpusTool
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ione_opustool_OpusTool
* Method: nativeGetString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ione_opustool_OpusTool_nativeGetString
(JNIEnv *, jobject);

/*
* Class: com_ione_opustool_OpusTool
* Method: encode_wav_file
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_encode_1wav_1file
(JNIEnv *, jobject, jstring, jstring);

/*
* Class: com_ione_opustool_OpusTool
* Method: decode_opus_file
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_decode_1opus_1file
(JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

接下來復制一份com_ione_opustool_OpusTool.h文件到jni目錄,修改名稱為com_ione_opustool_OpusTool.c修改內容為:

[cpp] view plain
#include <com_ione_opustool_OpusTool.h>

JNIEXPORT jstring JNICALL Java_com_ione_opustool_OpusTool_nativeGetString
JNIEnv * env, jobject obj) {
return (*env)->NewStringUTF(env, "Hello Opus");
}

JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_encode_1wav_1file(
JNIEnv *env, jobject obj, jstring wav_path, jstring opus_path) {
return 0;
}

JNIEXPORT jint JNICALL Java_com_ione_opustool_OpusTool_decode_1opus_1file(
JNIEnv *env, jobject obj, jstring wav_path, jstring opus_path) {
return 0;
}
然後創建並配置makefile和android.mk文件,後面會給出。記得配置NDK_Builder。
此時可以調用OpusTool類的nativeGetString()方法查看返回數據是否正常,若為Hello Opus 則jni調用成功。可以繼續下面的工作。

在jni目錄下創建libopus文件夾,將Opus源碼粘貼到該文件夾下,即celt、include、silk、src文件夾以及config文件,當然不是所有的文件都用的上,可以根據自記得需求進行拷貝。配置好makefile等配置文件後即可編譯工程,如果編譯順利,則說明配置文件沒有問題,繼續操作。在src文件加下創建opus_tool.c文件用來進行音頻文件的編解碼的c實現。
opus_tool.c

[cpp] view plain
/*****************************************************************************
# -*- coding:utf-8 -*-
# author: ione
# create date: 2014-11-27
*****************************************************************************/
#include "android_log.h"
#include "opus.h"
#include "opus_types.h"
#include "opus_multistream.h"

#define SAMPLE_RATE 16000
#define CHANNEL_NUM 1
#define BIT_RATE 16000
#define BIT_PER_SAMPLE 16
#define WB_FRAME_SIZE 320
#define DATA_SIZE 1024 * 1024 * 4

int encode(char* in, int len, unsigned char* opus, int* opus_len) {
int err = 0;
opus_int32 skip = 0;

OpusEncoder *enc = opus_encoder_create(SAMPLE_RATE, CHANNEL_NUM,
OPUS_APPLICATION_VOIP, &err);
if (err != OPUS_OK) {
fprintf(stderr, "cannnot create opus encoder: %s\n",
opus_strerror(err));
enc = NULL;
return -1;
}

opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND));
opus_encoder_ctl(enc, OPUS_SET_BITRATE(BIT_RATE));
opus_encoder_ctl(enc, OPUS_SET_VBR(1));
opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10));
opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0));
opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO));
opus_encoder_ctl(enc, OPUS_SET_DTX(0));
opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0));
opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16));

short frame_size = WB_FRAME_SIZE;
int frame_bytes = (frame_size << 1);

opus_int16 *frame = (opus_int16 *) in;
unsigned char *cbits = opus;

while (len > frame_bytes) {
int nbytes = opus_encode(enc, frame, frame_size, cbits + sizeof(char),
640 - sizeof(short));
if (nbytes > frame_size * 2 || nbytes < 0) {
return -1;
}
cbits[0] = nbytes;
frame += WB_FRAME_SIZE;
cbits += nbytes + sizeof(char);
len -= frame_bytes;
*opus_len += nbytes + sizeof(char);
}
opus_encoder_destroy(enc);
return 0;
}

int decode(unsigned char* in, int len, short* out, int* out_len) {
int err = 0;
opus_int32 skip = 0;
*out_len = 0;

OpusDecoder *dec = opus_decoder_create(SAMPLE_RATE, 1, &err);
if (err != OPUS_OK) {
fprintf(stderr, "cannnot decode opus: %s\n", opus_strerror(err));
dec = NULL;
return -1;
}

short frame_size = WB_FRAME_SIZE;

opus_int16 *frame = (opus_int16 *) in;

while (len > 0) {
int nbytes = in[0];
if (nbytes <= 0) {
return -1;
}
int decode_len = opus_decode(dec, in + sizeof(char), nbytes, out,
frame_size, 0);
if (decode_len != frame_size) {
return -1;
}

in += sizeof(char) + nbytes;
out += frame_size;
len -= nbytes - sizeof(char);
*out_len += frame_size;
}
opus_decoder_destroy(dec);
return 0;
}

int encode_wav_file(char *in_file_path, char *out_file_path) {
FILE *fin = fopen(in_file_path, "rb");

if (fin == NULL || fin == 0) {
return -1;
}
char *in = (char*) malloc(DATA_SIZE);
memset(in, 0, DATA_SIZE);
int len = fread(in, 1, DATA_SIZE, fin);
if (len == 0) {
return -1;
}
FILE *fout = fopen(out_file_path, "wb");

if (fout == NULL || fout == 0) {
return -1;
}

unsigned char *out = (unsigned char*) malloc(DATA_SIZE);
memset(out, 0, DATA_SIZE);
int out_len = 0;
encode(in, len, out, &out_len);
if (len < 0) {
return -1;
}
fwrite(out, 1, out_len * sizeof(unsigned char), fout);

free(in);
free(out);
fclose(fin);
fclose(fout);
return len;
}

int make_wav_header(FILE *out, int len) {
int size = 0;
int *sz = &size;
int number;
int * nm = &number;

// RIFF 4 bytes
fseek(out, 0, SEEK_SET);
fputs("RIFF", out);

// len 4 bytes
len = (len + 44 - 8);
fwrite(&len, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);

// WAVE 4 bytes + "fmt " 4 bytes
fputs("WAVEfmt ", out);

// size1 4 bytes
number = 16;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);

// format tag 2 bytes
number = 1;
fwrite(nm, 2, 1, out);

// channel 2 bytes
number = CHANNEL_NUM;
fwrite(nm, 2, 1, out);

// sample rate 4 bytes
number = SAMPLE_RATE;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);

//byte per seconds 4 bytes
number = 22664;
fwrite(nm, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);

// block align 2 bytes
number = CHANNEL_NUM * BIT_PER_SAMPLE / 8;
fwrite(nm, 2, 1, out);

// bitPerSample 2 bytes
number = 16;
fwrite(nm, 2, 1, out);

// "data" 4 bytes
fputs("data", out);

// size2 4 bytes
size = (size - 36);
fwrite(sz, 2, 1, out);
number = 0;
fwrite(nm, 2, 1, out);

return 0;
}

int decode_opus_file(char *in_file_path, char *out_file_path) {
printf("%s\n", in_file_path);
FILE *fin = fopen(in_file_path, "rb");
if (fin == NULL || fin == 0) {
return -1;
}
unsigned char *in = (unsigned char *) malloc(DATA_SIZE);
memset(in, 0, DATA_SIZE);
int len = fread(in, 1, DATA_SIZE, fin);

FILE *fout = fopen(out_file_path, "wb");
if (fout == NULL || fout == 0) {
return -1;
}
short *out = (short *) malloc(DATA_SIZE);
memset(out, 0, DATA_SIZE);

int out_len = 0;
out += 44;
decode(in, len, (short *) out, &out_len);
if (len < 0) {
return -1;
}
fwrite(out, 1, out_len * sizeof(short), fout);
int err = make_wav_header(fout, out_len);

free(in);
free(out);
fclose(fin);
fclose(fout);
return out_len;
}
配置makefile文件添加opus_tool.c文件,然後編譯,即可在libs目錄下生成.so文件

熱點內容
隆地優選交易密碼是什麼 發布:2025-05-14 21:53:23 瀏覽:93
強酸強鹼存儲櫃 發布:2025-05-14 21:45:16 瀏覽:563
車輛參數配置包括什麼 發布:2025-05-14 21:31:03 瀏覽:163
怎麼引入安卓項目 發布:2025-05-14 21:26:39 瀏覽:824
游戲輔編程 發布:2025-05-14 21:18:49 瀏覽:687
三菱plc一段二段密碼什麼意思 發布:2025-05-14 21:17:16 瀏覽:528
電腦開機密碼忘記了怎麼破解 發布:2025-05-14 21:09:40 瀏覽:57
pythondict格式 發布:2025-05-14 21:09:38 瀏覽:886
落葉片拍攝腳本 發布:2025-05-14 20:40:49 瀏覽:799
安卓為什麼不能用cmwap 發布:2025-05-14 20:40:43 瀏覽:658