簡體   English   中英

定義功能宏:編譯器參數與源代碼?

[英]Define Feature Macro: Compiler Argument vs Source Code?

我最近遇到了功能宏_POSIX_C_SOURCE ,它允許在包含包含 POSIX 函數的標頭時指定所需的最低 POSIX 版本,例如strdup<string.h> ,也即將推出 C23)或clock_gettime<time.h> )。 啟用strdup的正確方法是定義_POSIX_C_SOURCE至少為200401L (2004 年,版本 1),對於clock_gettime ,它至少為200101L 一些庫供應商可能不會編寫檢查/ #ifs來啟用或禁用 function 聲明,這會使某些程序在程序員未定義功能宏時無法與其他庫實現一起編譯。


您可以通過兩種方式啟用 POSIX 功能。

1.包含前定義

#define _POSIX_C_SOURCE 200401L
#include <time.h>
#include <string.h>

2、在編譯器中定義arguments,在源碼中確保:

gcc ... -D_POSIX_C_SOURCE=200401L

在源文件中

#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 200401L
#  error the minimum required POSIX version is 2004.1
#endif
#include <time.h>
#include <string.h>

我考慮插入檢查,因為源文件可能以不同的方式編譯(其他編譯器、其他構建鏈、其他 makefile 等...),這可以防止缺少編譯器參數。


我認為第一個是最快的,但第二個更干凈。

問題

  1. 如果在定義功能宏之前包含 header,第一個是否有問題? (見下面的代碼)
  2. 以前禁用的功能是否因為文件現在包含版本號(大於默認值)而啟用?
  3. 有沒有更好的方法來定義和確保這些宏?
#include <time.h>
#include <string.h>
...
#define _POSIX_C_SOURCE 200401L
#include <time.h>
#include <string.h>

這些定義絕對屬於源代碼,因為它們 state 是您代碼的要求。 如果你的代碼需要一個功能宏,你基本上是說它需要宏將啟用的(某些)功能。 如果你不把它放到你的源文件中,你將如何記錄它?

並且不要像在您重新包含一些標頭的示例中那樣嘗試做一些花哨的事情。 在幾乎所有情況下,這絕對行不通。

不建議從編譯器命令行定義特征宏。 這些應該只用於將編譯時信息傳遞給您在編寫代碼時不知道的代碼。 例如。 版本號或啟用/禁用代碼的可選行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM