concepts - preprocessor

MudOS v21c2

Ԥ������ (preprocessor)


LPC Ԥ������ (preprocessor) �ֲ�
(93.07.17 ����)

�� LPC ������ (compiler) ����, Ԥ��������Դ�������ǰ��, ���ṩ���±���������:

  • ����Ķ����Դ���� (#include)
  • �� (macros) (#define, #undef)
  • �������� (#if, #ifdef, #ifndef, #else, #elif, #endif)
  • ���� (#echo)
  • ʹ���ض��ı��������� (#pragma)
  • ���ٵ����¸�ʽ (@, @@)
ǰ������ C ��ͬ. �������Ϥ C ����, ���ֻ������˷��ļ�����󼸶�����.

˵��:

    ǰ���� # ��ͷ������ (���� #include), �� # ���ű������ÿ�еĵ�һ����, ǰ�治�����пհ�.

����Ķ����Դ����

#include �ṩ�˹���.
    �﷨ 1 :���� #include <file.h>
    �﷨ 2 :���� #include "file.h"
˵��:
    �﷨ 1�� ����ʽ, ����ϵͳ�ı�׼���� (include) Ŀ¼��, Ѱ�� file.h. (�� TMI ���� /include)
    �﷨ 2�� ����ʽ, ���ڳ����ļ����ڵ�ͬһ��Ŀ¼��, Ѱ�������õ� file.h
#include ���������������ķ�ʽ, ��һ���ļ���������һ���ļ�. ��һ���ļ��з����� #include "file.h" �����, ����ͬ file.h ������ֱ�ӷ��� #include ���ڵ�λ��. ��ÿ��������±���ʱ, ��������õ��ļ�Ҳ�����±���һ��. ������õ��ļ������б�����������ļ��е���ͬ, ������ļ�ʱ�����˫�������Ĵ��� (duplicate-name error) (������� file.h �����ݷ��� #include ��λ��, һ�����������).


��

�궨�彫����Դ�����е�һЩ�ֻ��ɶ��������. Ŀ���������س����ڲ���ϸ�ڡ����ٴ��ֵ����������ڸ��ij��� (constant).
    �﷨ 1 : #define identifier token_sequence
    �﷨ 2 : #define identifier(id_list) token_sequence
˵��:
    ������, Դ�����е� identifier ʹ�ô�дӢ����ĸ��ǿ�����������ֵ�λ��, ������Դ���뿪�˻��������õı�ͷ�� (header file)�� �ж���������.
    �ڶ����﷨�� id_list �г��� identifier �ܴ����� token_sequence.
����:
    /*�� ���һ���� 40 ��Ԫ�ص���������, ��������Ԫ�ص�ֵ��ʼ��Ϊ���ŵ�����. �� stack[0] = 0, stack[1] = 2, stack[2] = 4 ....�Դ�����. */

    #define STACKSIZE 40
    #define INITCELL(x) 2*x

    int *stack;

    create() {

      int i;

      stack = allocate(STACKSIZE);

      for (i = 0; i < STACKSIZE; i++)

        stack[i] = INITCELL(i);

    }

���, ��ʱ���õ�������� (undefine) ���ñ����� (compiler) �����˶����. �������õ����������.
    �﷨ : #undef identifier
˵��:
    #undef �������һ�����������ڵ� identifier.

��������

��Щ������������ij�������п����� (flexibility). ���� identifier �������, ����Ϊ��ͬ��Ŀ�Ķ��仯Դ����. ��;������ѡϵͳ����Ա���ߡ�֧Ԯ����������� (��ͬ�汾����������).

�﷨ :

    #ifdef <identifier>
    #ifndef <identifier>
    #if <expression>
    #elif <expression>
    #else
    #endif
˵��:
    ��<identifier> ��һ���Ѿ����� (��Ӧ�ö���) �� identifier. ��Ӧ�����ij�������Ѿ����õ��ļ����ȶ���, ��Ȼ�������������Ѷ���ķ��� (symbol).
    ��<expression>�� ��һ����������ʽ (constant expression), ���㲼�� (boolean) �߼�����. ����ʽ��, �����ں����﷨��������, ʹ����������:
      �����: ||, &&, >>, <<, +, -, *, /, %, &, |, ^, !, ~, ==, !=, <, >, <=, >=, ?:
      �������������: (, )
      ������ʽ: defined(identifier)
      �Լ� identifiers
    #ifdef identifier
    ������Ϊ���е���д:
      #if defined(identifier)
    ��
      #ifndef identifier
    ������Ϊ���е���д:
      #if !defined(identifier)
      #elif expression
    ������Ϊ��Щ����д:
      #else
      #�� if expression
      #�� endif
���� 1:
    /* ʹ�� #if 0�� ����������һ��Դ�����м���ע�� (comment). ������������һ�������ǰѾɵ�Դ���뱣����ԭλ, ��ֹ�µij���ʧ��. */
    #if 0
    /* �ڴ�, ��������ʽ��� (��˵��������) 0 , ���Դ˶�Դ���벻�����. */
      write(user_name + " �� " + total_coins + " Ԫ.\n");
    #else
    /*�� ������������� (if �����ֵ, else ���Ƿ���ֵ), ���Ի����˶γ���. */
      printf("%s �� %d Ԫ\n", user_name, total_coins);
    #endif
���� 2:
    //�� ��������� TMI �� /adm/simul_efun/system.c �����.
    #ifdef __VERSION
      string version() { return __VERSION__; }
    #elif defined(MUDOS_VERSION)
      string version() { return MUDOS_VERSION; }
    #else
    #�� if defined(VERSION)
      string version() { return VERSION; }
    #�� else
      string version() { return -1; }
    #�� endif
    #endif

����


#echo ������������������� stderr (STanDard ERRor, ��׼������) ӡ����Ϣ. ���������Ϻͳ���ʱ�dz�����.
    �﷨:
      #echo This is a message
˵��:
    #echo ���о�����Ϣ������, ������ӡ��. ��Ϣǰ���ü��� ".

�ض��ı༭������


���������������ڽ��Ĺ���.
    �﷨:
      #pragma keyword
Ŀǰ���õ� keyword ��������:
��
  • strict_types
  • save_binary
  • save_types
  • warnings
  • optimize
  • error_context
ʹ�� #pragma no_keyword ���Թر�ָ���Ĺ���.

˵��:

    • 'strict_types' ���߱��������� call_other() �ĺ���, �䷵��ֵ���ɺ���.
    • ��'save_binary' ���߱�����Ҫ���������Ķ���λ (binary) ��. ����������ر���Ϸ֮��, ���������ʱ�����, ��Ϊ����Ѿ�����Ϊ����λ��, �������±���.
    • ��'save_types' Ŀǰͣ��
    • ��'warnings' ������ LPC�� Դ���뿪��һЩ�����ʩ. ��Щ���治���û�������Ԥ���еĽ����Ӧ.
    • ��'optimize' ��һ��ʱ��Ľ��������Դ����Ч��.
    • ��'error_context'�� �ڴ�����Ϣ��ʹ�ø��������ָʾ��һ�з�������.

�������¸�ʽ


����ܱ���������Ϣ���������ȳ�ƪ����ʹ�����¸�ʽ.
    �﷨ 1 :
      @marker
      <... text block ...>
      marker
    �﷨ 2 :
      @@marker
      <... text block ...>
      marker
Notes:
    @���� - ����һ������ write() ���ַ���.
    @@�� - ����һ���ַ�������, ���ڷ�ҳ���� (body pager).
�ڽ������ (end marker) ֮ǰ, ʹ�� @marker �� @@marker. ����֮���������ʹ������ʾ������. ������ marker ��Ϊ����, ���ؼ� @ �� @@. ʹ�� @, ���¾���ͬһ���ַ���, ���д����� \n.�� ʹ�� @@,�� ���¾���ͬһ���ַ�������, ��ÿһ�зֱ���һ���ַ���.

���� 1 :

    int help() {
      write( @ENDHELP
    �����������¡�
    It's hopelessly inadequate.
    ENDHELP
      );
      return 1;
    }
    �����ͬ:
    int help() {
      write( "�����������¡�\nIt's hopelessly inadequate.\n" );
      return 1;
    }
���� 2 :
    int help() {
      this_player()->more( @@ENDHELP
    �����������¡�
    It's hopelessly inadequate.
    ENDHELP
      , 1);
      return 1;
    }
    �������ͬ:
    int help() {
      this_player()->more( ({ "�����������¡�", "It's hopelessly inadequate." }), 1);
      return 1;
    }

����: Spock @ FF 97.Aug.9.

�ص���һҳ