易出錯的C語言題目之一:宏定義與預處理

一、寫出下列代碼的運行結果:

#include<stdio.h>
#include<string.h>
#define STRCPY(a,b) strcpy(a##_p,#b)

int main(){
    char var1_p[20];
    char var2_p[30];

    strcpy(var1_p,"aaaa");
    strcpy(var2_p,"bbbb");

    STRCPY(var1,var2);
    STRCPY(var2,var1);

    printf("var1 = %s/n",var1_p);
    printf("var2 = %s/n",var2_p);

    printf("\n");

    return 0;
}

答案:spa

var1 = var2/nvar2 = var1/ncode

解析:blog

#爲字符串化操做符,將所鏈接的部分轉化爲一個字符串,##爲字符串鏈接符,將兩個字符串鏈接成一個字符串,均在預處理時完成字符串的替換。字符串

二、寫出下列代碼的運行結果:

#include<stdio.h>

#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)

int main(){
    printf("%s\n",h(f(1,2)));
    printf("%s\n",g(f(1,2)));
    return 0;
}

答案:string

12
f(1,2)io

解析:class

本題考察字符串化操做符#得做用得執行過程,以及宏定義替換的次序。若是該宏爲帶#號的宏定義,則直接替換字符串,無需再嵌套替換,若是該宏不是帶#的宏,則先替換括號內部的宏定義,而後替換外部的。變量

三、定義一個宏,求一個結構體struct中某個變量相對於struct的偏移量

答案:ember

#define OFFSET(struct, member)  ((unsigned int)&((struct *)0)->member)di

相關文章
相關標籤/搜索