如何使用预处理器宏填充字符串

Mem*_*lox 3 c string c-preprocessor

是否可以仅使用预处理器宏用空格(或任何字符)填充字符串?如果是这样,如何?

例子:

#define SOME_STR               "v1.1"
#define STR_PAD(str, len)      // <-- padding defined string

#define SOME_STR_PADDED        STR_PAD(SOME_STR, 10)        // evaluates to "v1.1      "
Run Code Online (Sandbox Code Playgroud)

我知道在运行时有简单的解决方案,但我的问题是如何在编译时填充字符串。

chq*_*lie 5

非常有趣的问题!在strlen都未知的一般情况下,以及str单独未知的情况下,这似乎是不可能的。如果 的长度str已知并且len受某个合理的固定值限制,则可以生成编译为单个字符串常量的复合三元表达式。

这是一个插图:

// compile time padding: str must be a string constant and len <= 4 + strlen(str)
#define STR_PAD(str, len)  (((len) + 1 <= sizeof str) ? str :        \
                            ((len) == sizeof str) ? str " " :        \
                            ((len) == sizeof str + 1) ? str "  " :   \
                            ((len) == sizeof str + 2) ? str "   " :  \
                            str "    ")
Run Code Online (Sandbox Code Playgroud)