Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.
#define temp func
значение макроса func не подставляется. В temp попадает буквально слово func
. После #undef func
содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan#define foo bar
#define func foo
...
#undef func
...
#define func foo
printMAS (&MAS);//будет ошибкой! Почему?
&MAS
-- int (*)[5]
. Значение же адреса будет одним и тем же.Вот такие инструкции же работают...
...
и интерпретируется внутри как void *
, т.е. тип исходного адреса больше не имеет значения. #include <stdio.h>
#include <string.h>
#include <pcre.h>
#define DATE_SIZE 11
int main(int argc, char* argv[]) {
pcre *pattern;
const char *error_str;
int error_offset;
int matches[1];
pattern = pcre_compile("^\\d{2}\\.\\d{2}\\.\\d{4}$", 0, &error_str, &error_offset, NULL);
if(pattern == NULL) {
printf("Could not compile: %s\n", error_str);
return 1;
}
char str[DATE_SIZE];
fgets(str, DATE_SIZE, stdin);
int r = pcre_exec(pattern, NULL, str, strlen(str), 0, 0, matches, 1);
pcre_free(pattern);
if (r < 0)
puts("Invalid date");
else
puts("Valid date");
return EXIT_SUCCESS;
}
int*a;
int* a;
int *a;
int * a;
int * a, * b, c, * d, e; // a, b и d - указатели, c и e - числа
int *a, *b; // нормально
int* a, b; // Ошибка: b кажется указателем, но на самом деле - число.