Предварительный процесс Stringify C

Это мой первый пост, поэтому, если я слишком расплывчат или даю информацию, которую все интуитивно предполагают, пожалуйста, дайте мне знать.

Я новичок в написании на C и просто пытаюсь лучше понять предварительную обработку. Я пишу простую программу, которая может принимать аргументы либо непосредственно из консоли, используя gcc -Wall -std=c99 -DSEED=argument, где мой аргумент должен быть целым числом, либо, если -D не определен, пользователь вводит его.

Значение SEED просто используется в srand(). Я очень запутался, почему мой код не скомпилируется, если я вставлю -DSEED=a в качестве аргумента, а если я вставлю -DSEED=1, он скомпилируется. Я получаю сообщение об ошибке "ааа необъявлено (первое использование в этой функции)" и действительно не понимаю разницы между ними. Я думал, что #define соответствует типу переменной с вводом, поэтому, если я введу «a», #SEED будет char, а если я вставлю «1», #SEED будет int.

Если SEED не определен, я использую команду #ifndef SEED, и это работает хорошо. Я думаю, что я должен «упорядочить» ввод SEED, а затем проверить, является ли он целым числом или нет. После прочтения некоторых статей в Интернете я пытаюсь использовать:

#ifndef SEED
    //code
#else
    #define TO_STRING( input ) #input
    char c;
    c = TO_STRING( SEED )
    //Then I was going to use c to figure out if it was an int.
#endif

Это не работает, и любой, кто может указать на любые неправильные представления, которые, по вашему мнению, у меня могут быть, будут очень признательны.

РЕДАКТИРОВАТЬ. Итак, я понял, почему я получал сообщение об ошибке при попытке -DSEED=a, потому что он читал его как переменную.


person michaelp    schedule 11.10.2012    source источник
comment
Во-первых, символу не может быть назначен строковый литерал.   -  person chris    schedule 11.10.2012


Ответы (1)


Чтобы упорядочить #define, вам нужно использовать двухэтапный подход:

#define _STRINGIFY(s) #s
#define STRINGIFY(s) _STRINGIFY(s)

...

#define SEED 123

...

const char * pszSeed = STRINGIFY(SEED); /* 'pszSeed' would point to "123" form here on. */

Если вы хотите использовать только один символ, просто получите к нему доступ через *pszSeed или pszSeed[0].

person alk    schedule 11.10.2012
comment
Это определенно сработало! Большое спасибо. Не могли бы вы просто сказать мне, правильно ли я думаю, почему это на самом деле работает? Итак, первые _STRINGIFY преобразуют что угодно в строку из-за #, вторая STRINGIFY поместит расширенный макрос в первый #define? Финальное сопровождение. Могу ли я использовать # только в макросе для создания строки? Большое спасибо за Вашу помощь! - person michaelp; 12.10.2012