Aprendiendo lengua C tercer día

No es un documento o un tutorial, es solo supervisarme para aprender el lenguaje C marcando y grabando solo algunas notas pequeñas. Si hay algún error, ¡muchas gracias por señalarlo! ! !

Uno, el proceso de compilación

(Código fuente) -> [preprocesamiento] -> (código fuente después del reemplazo de la macro) -> [compilador] -> (archivo intermedio) -> [vinculador] -> (programa ejecutable)

Dos, defina el archivo de encabezado usted mismo

Introduzca su propio archivo de encabezado definido

  • Puede utilizar, por ejemplo, #inclue "… / head / xx.h", utilizando "" dará prioridad a la búsqueda en el directorio del archivo fuente actual
  • Por ejemplo, utilice el archivo B definido en el archivo A para importar directamente el archivo de encabezado B, mientras que el archivo de encabezado B solo tiene declaraciones, el archivo .c de B es la implementación específica y el archivo .c de B presenta el archivo de encabezado B
  • La razón por la que el archivo .c de B se puede encontrar a través del archivo de encabezado de B es porque el archivo .c se agrega al proyecto

Tres, función macro

  • Las macros con parámetros se convierten en funciones de macro
  • Tenga en cuenta que la función de macro no opera, pero se expande en su lugar, por lo que la función de macro generalmente usa () para asegurarse de que la expresión pasada no se confunda, pero esto no es una panacea. Por lo tanto, cuando utilice una función de macro, asegúrese de que la expresión pasada durante la llamada no afecte a la siguiente
  • Los parámetros y el valor de retorno de la
    función macro no tienen requisitos de tipo. Caso de función macro
#include <stdio.h>
#define MAX(a, b) (a) > (b) ? (a) : (b)
#define IS_HEX_CHARACTER(ch) \
((ch) >= '0' && (ch) <= '9') || \
((ch) >= 'A' && (ch) <= 'F') || \
((ch) >= 'a' && (ch) <= 'f')
int Max(int a, int b) {
    
    
  return a > b ? a : b;
}
int main() {
    
    
  int max = MAX(1.0, 3);
  int max2 = MAX(1, MAX(3, 4));
  //函数是会进行计算之后赋值,而宏函数是就地展开
  int max3 = Max(1, Max(3, 4));
 //这里传入的表达式就是对后续结果照成了影响
  int max4 = MAX(max++, 5);

  printf("max2: %d\n", max2);

  printf("is A a hex character? %d\n", IS_HEX_CHARACTER('A'));
  return 0;
}

Cuarto, compilación condicional

  • ifndef: si no está definido, se usa para determinar si una macro está definida
  • ifdef: si está definido, se utiliza para determinar si una macro está definida
  • if: if, se utiliza para determinar si se define una macro o una expresión, etc.
  • Ejemplos de if son: #if define (MACRO) ==> #ifdef MACRO
  • endif: fin

Escritura de código en entorno c ++ y c

#ifdef __cplusplus
extern "C" {
    
    
#endif

//.....

#ifdef __cplusplus
};
#endif

Determine la versión actual de c

#if __STDC_VERSION__ >= 201112
  puts("C11!!");
#elif __STDC_VERSION__ >= 199901
  puts("C99!!");
#else
  puts("maybe C90?");
#endif

También puede determinar el sistema operativo actual, etc ...

Cinco, implementación personalizada de la función de impresión

#include <stdio.h>
#include <stdarg.h>

void Printlnf(const char *format, ...) {
    
    
  va_list args;
      va_start(args, format);
  vprintf(format, args);
  printf("\n");
      va_end(args);
}

// "Hello ""world" ==> "Hello world"
// __FILE__
// __LINE__
// __FUNCTION__
// (../05.printlnf.c:20) main :

#define PRINTLNF(format, ...) printf("("__FILE__":%d) %s : "format"\n",__LINE__, __FUNCTION__, ##__VA_ARGS__)

#define PRINT_INT(value) PRINTLNF(#value": %d", value)

int main() {
    
    
  int value = 2;
  Printlnf("Hello World! %d", value);
  PRINTLNF("Hello World! %d", value);
  PRINTLNF("Hello World!");

  PRINT_INT(value); // value: 2
  int x = 3;
  PRINT_INT(x);

  PRINT_INT(3 + 4);
  return 0;
}

Seis, lío

  • Si desea agregar el archivo de encabezado al proyecto en Clion, escriba include_direcories ("el nombre del archivo donde se encuentra el archivo de encabezado") en cmake.txt

Supongo que te gusta

Origin blog.csdn.net/qq_45549336/article/details/112744523
Recomendado
Clasificación