![](/img/trans.png)
[英]Different Memory-need in case of using “const” and “#define” in IAR
[英]IAR build library with different #define
我將在IAR Workbench中為STM8構建一個簡單的庫(.a文件)。 在這個庫中,我想同時實現硬件SPI和軟件SPI供用戶選擇。
在我的library.c中,我寫道:
#include "library.h"
void LibraryInit()
{
#ifdef HARDWARE_SPI
funcToInitHardwareSPI();
#else
funcToInitSoftwareSPI();
#endif
}
然后在我的library.h中,我寫道:
#ifndef __LIB_H
#define __LIB_H
#define HARDWARE_SPI
void LibraryInit();
#endif
然后,我認為如果用戶在目標項目中定義#define HARDWARE_SPI
,則該庫將運行硬件SPI部分。 如果不是,則應使用軟件SPI。
但是,在我構建了項目並向測試項目中添加了library.a和library.h之后,library.h沒有#define HARDWARE_SPI
,例程仍將進入硬件SPI部分。 我如何構建library.a,可以讓用戶通過在頭文件中編寫#define
來選擇函數?
.a
文件是在用戶決定硬性或軟性spi之前構建的,因此您不能這樣做。 您必須構建兩個代碼路徑。 將庫作為源存在問題嗎?
考慮到您使用的是8位MCU,我假設您不想弄亂帶有函數指針的大型抽象,因此對代碼路徑的所有選擇都必須在提供的標頭中進行。 如果您的編譯器支持C99,則可以在標頭中內聯放置在實現之間切換的函數:
/* library.h */
#pragma once
void funcToInitHardwareSPI();
void funcToInitSoftwareSPI();
inline void LibraryInit()
{
#ifdef HARDWARE_SPI
funcToInitHardwareSPI();
#else
void funcToInitSoftwareSPI();
#endif
}
考慮到現在兩個代碼路徑都已添加到您的庫中,您可能希望使用每個函數在單獨的部分中對其進行編譯,然后在鏈接期間刪除所有未使用的部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.