2016-11-27 4 views
1

Я хотел бы знать, можно ли превратить известную строку в int во время компиляции/предварительной обработки.C - Поверните строку в Int на компиляции

Представьте У меня есть строка с «AB» The обугливается, и я хотел бы, чтобы превратить его в междунар как в союзе:

union StrInt 
{ 
    int i; 
    char c[2]; 
} 

c[ ] = 'AB' сделает я иметь значение 16961

Я хотел бы сделать то же самое, но во время компиляции/предварительной обработки

+2

Зачем вам это нужно? –

+0

Это было бы очень полезно для моего приложения. – user7122079

+3

C не C++ не C. Выберите один! – Olaf

ответ

1

Да. На моей архитектуре (x86_64-рс-линукс-Гну ), это:

union { 
    int i; 
    char c[2]; 
} u = { .c="AB" }; 

int main() 
{ 
    printf("%d\n", u.i); 
} 

печатает 16961 так же, как вы ожидаете. (Различные реализации могут давать разные выходы.)

Массивы символов обычно могут быть инициализированы строковыми литералами.

{ .c= { 'A', 'B' } } 

был бы еще одним способом для активизации члена c.

+0

Но это было сделано во время предварительного/компиляции? Или казнь? Спасибо;) – user7122079

+0

«AB» статически запекается в двоичное изображение, и во время выполнения вы просто получаете доступ как int. В этом нет никакого преобразования. Значение статически известно, но не целочисленное постоянное выражение (или constexpr в современном диалекте C++). (Фактически, он не используется, например, в коммутаторах или других местах, которые ожидают целочисленную константу) – PSkocik

+0

Многосимвольные константы очень плохо определены. Не только длина остается для реализации, но также и энсианс и кодирование. Вы должны были указать это более явно. – Olaf

Смежные вопросы