C为特定用例对齐字符串文字

C为特定用例对齐字符串文字,c,string,gcc,alignment,clang,C,String,Gcc,Alignment,Clang,我试图以一种特定的方式对齐字符串文本,因为我在代码中使用它的方式相当具体。我不想把它赋给一个变量,例如,我的许多函数都将它用作直接参数。我希望它既能在本地范围内工作,也能在全局范围内工作 用法示例: char *str = ALIGNED_STRING("blah"); //what I want foo(ALIGNED_STRING("blah")); //what I want _Alignas(16) char str[] = "blah"; //not what I want (but

我试图以一种特定的方式对齐字符串文本,因为我在代码中使用它的方式相当具体。我不想把它赋给一个变量,例如,我的许多函数都将它用作直接参数。我希望它既能在本地范围内工作,也能在全局范围内工作

用法示例:

char *str = ALIGNED_STRING("blah"); //what I want
foo(ALIGNED_STRING("blah")); //what I want

_Alignas(16) char str[] = "blah"; //not what I want (but would correctly align the string)
理想的解决方案是
(u Alignas(16)char[]){“blah”}
或使用GCC/Clang编译器扩展进行对齐
(uu属性_uu((alignment(16)))char[]){“blah”}
,但两者都不起作用(忽略它们并使用该类型的默认对齐方式)

所以我的下一个想法是自己对齐它,然后使用字符串的函数可以正确地修复它。e、 g.
#定义对齐的字符串(str)(char*)((uintpttr_t)(char[]){“xxxxxxxxxxxxx”str}+16-1)和(16-1))
(其中包含“x”的字符串将表示理解在何处可以找到真实字符串所需的数据,这很容易,但仅在示例中假设“x”是正确的)。现在,这在局部范围内运行良好,但在全局范围内失败。因为编译器抱怨它不是编译时常量(错误:initializer元素不是编译时常量);我本以为它会工作,但似乎只有加法和减法是编译时指针上的有效操作


所以我想知道是否有任何方法可以实现我想做的事情?目前,我只是使用后一个示例(填充和手动对齐),并避免在全局范围内使用它(但我真的很想)。最好的解决方案是避免进行运行时调整(就像使用对齐限定符一样),但除非我将其应用于变量,否则这似乎是不可能的(但如前所述,这不是我想要做的)。

能够通过复合文字接近OP的需要。(C99)


为什么是16而不是
sizeof(max\u align\u t)
@chux 16只是一个例子,但我确实需要一个特定的固定大小,因为我正在将空闲位用于其他信息(标记指针)。注意:尝试了
\u Alignas(16)
和no
struct
,但失败了。谢谢,这是一个很棒的解决方案。并且完全符合我的需要(在本地和全球都适用)。@ScrimpyCat在一个月后回复,告诉我编码的进展。
#include <stdio.h>
#include <stddef.h>

void bar(const char *s) {
  printf("%p %s\n", (void*)s, s);
}

//                         v-- compound literal --------------------------v
#define ALIGNED_STRING(S)  (struct { _Alignas(16) char s[sizeof S]; }){ S }.s

int main() {
  char s[] = "12";
  bar(s);
  char t[] = "34";
  bar(t);
  bar(ALIGNED_STRING("asdfas"));
  char *u = ALIGNED_STRING("agsdas");
  bar(u);
}
0x28cc2d 12
0x28cc2a 34
0x28cc30 asdfas  // 16 Aligned
0x28cc20 agsdas  // 16 Aligned