URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6595
[ Назад ]

Исходное сообщение
"препроцессор cpp . сравнение строк"

Отправлено borey2005 , 10-Июл-07 14:58 
Привет
вот такая конструкция работала на каком то(не помню каком) gcc
# gcc -DCPU=PENTIUM test.c
cat test.c
void main(void)
{
#if CPU == PENTIUM
    printf("intel");
#elif CPU == ATHLON
    printf("amd");
#endif
}
и всё пучком.
на gcc4 то же самое не прокатывает. строки сравнивать не хочет. Судя по ману сравнивать можно только числовые параметры (xnj и подтверждается тестом), а строки как таким образом сравнить не подскажет ли кто?
Заранее спасибо.

Содержание

Сообщения в этом обсуждении
"препроцессор cpp . сравнение строк"
Отправлено phpcoder , 10-Июл-07 15:05 
[...]

[c0der@rock ~]$ gcc -DCPU=PENTIUM opennet.c -o opennet
opennet.c: В функции 'main'
opennet.c:4: предупреждение: incompatible implicit declaration of built-in function 'printf'
opennet.c:2: предупреждение: return type of 'main' is not 'int'
[c0der@rock ~]$ ./opennet
intel%                                                                          [c5der@rock ~]$ rpm -q gcc4.1                                            
gcc4.1-4.1.1-alt11

У меня, хоть и с варнингами, но работает.


"препроцессор cpp . сравнение строк"
Отправлено borey2005 , 10-Июл-07 15:21 
>[...]
>
>[c0der@rock ~]$ gcc -DCPU=PENTIUM opennet.c -o opennet
>opennet.c: В функции 'main'
>opennet.c:4: предупреждение: incompatible implicit declaration of built-in function 'printf'
>opennet.c:2: предупреждение: return type of 'main' is not 'int'
>[c0der@rock ~]$ ./opennet
>intel%            
>          
>          
>          
>          
>          
>       [c5der@rock ~]$ rpm -q
>gcc4.1
>gcc4.1-4.1.1-alt11
>
>У меня, хоть и с варнингами, но работает.
Нет не рабоатет. Оно первую строку всегда вывожит.
Поменяй на DCPU=ATHLON
а ворнинги не изза препрцессора.
#include <stdio.h>
и return 1 в конец main диобавить  пропадут они.
PS вот тут подсказали что PENTIUM и ATHLON тож макросы были в старом коде , которые определялись как число и соответственно всё работало.
Но всё равно думаю , нельзя что ли там строки использовать?


"препроцессор cpp . сравнение строк"
Отправлено jd , 10-Июл-07 20:09 
>PS вот тут подсказали что PENTIUM и ATHLON тож макросы были в
>старом коде , которые определялись как число и соответственно всё работало.
>
>Но всё равно думаю , нельзя что ли там строки использовать?

А откуда вы взяли, что PENTIUM и ATHLON в данном случае - строки? С точки зрения C это ни разу не они.

Если же опустить лирику, то более традиционно IMHO использование макросов примерно таким образом:

#ifdef PENTIUM
  printf("intel");
#elif defined ATHLON
  printf("amd");
#elif
  #error "Unknown processor. You must define PENTIUM or ATHLON."
#endif

Ну и, соответственно, при компиляции:
gcc -DINTEL test.c
или
gcc -DATHLON test.c

Если строже (по-моему определение макроса без значения - это расширение gcc), то что-то вроде -DINTEL=1. Вот, как-то так.


"препроцессор cpp . сравнение строк"
Отправлено jd , 10-Июл-07 20:11 
Опечатка:
>#elif
>  #error "Unknown processor. You must define PENTIUM or ATHLON."
тут конечно же не #elif, а #else.