0

Estoy tratando de aprender C y en varios tutoriales hacen la separación de funciones de esta manera:
ARCHIVO PRINCIPAL

#include <stdio.h>
#include "cabecera.h"

int main(void){
  printf("%f\n", suma(1, 2));
  printf("%f\n", resta(1, 2));
  printf("%f\n", multiplica(1, 2));
  printf("%f\n", divide(1, 2));
  return 0;
}

ARCHIVO CON FUNCIONES

#include "cabecera.h"

float suma(float a, float b){
  return a + b;
}
float resta(float a, float b){
  return a - b;
}
float multiplica(float a, float b){
  return a * b;
}
float divide(float a, float b){
  return a / b;
}

ARCHIVO CABECERA

float suma(float a, float b);
float resta(float a, float b);
float multiplica(float a, float b);
float divide(float a, float b);

si hago un archivo funciones.c con los prototipos y las funciones y lo incluyo en principal con #include "funciones.c" sí funciona. ¿Qué está mal con la cabecera?

EDITADO: Parece ser que el problema esta en la extension Code Runner. He probado a compilar desde la línea de comandos con:

gcc principal.c funciones.c

y me genera el exe sin problemas. Lo cómodo de code runner es que muestra el resultado por consola sin necesidad de abrir el .exe. ¿Alguna sugerencia?

EDICIÓN II: en base a lo sugerido he editado el task.json de la siguiente forma: cambiando la línea

"${file}"

por

"${fileDirname}/*.c"

y sigue sin funcionar al ejecutar desde code runner

{
    "version": "2.0.0",
    "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: gcc.exe build active file",
      "command": "C:\\MinGW\\bin\\gcc.exe",
      "args": [
        "-g",
        "${fileDirname}/*.c",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": "build",
      "detail": "compiler: C:\\MinGW\\bin\\gcc.exe"
    }
  ]
}
Hernán Garcia
  • 1,331
  • 3
  • 12
  • 1
    "*si hago un archivo funciones.c con los prototipos y las funciones y lo incluyo en principal con #include "funciones.c" si funciona*". Y de la otra forma no? La cabezera no tiene nada de malo, si te dio algun problema supongo que sera porque no le estas pasando al compilador todos los archivos. Pero no puedo estar seguro ya que no compartes ni cual es tu error, ni como estas compilando. Puedes añadir eso? – Pablochaches Aug 29 '21 at 23:32
  • El error es que no existe referencia a las funciones. Lo q pude averiguar es que vs code no compila archivos .h o multiples .c. si se compila desde la linea de comando incluyendo todos los archivos si funciona, pero si tienes 100 archivos vas a agregarlos todos en la linea de comando?. De todos modos la idea es usar la consola para ver los resultados y no estar abriendo los .exe. he visto tambien algo donde se toca el config.json pero no entendi bien como. Gracias!! – Hernán Garcia Aug 30 '21 at 00:07
  • 2
    Con vscode no puedes compilar a excepción que hagas las configuraciones necesarias para que vscode lo pueda hacer (algo que nunca he hecho). Lo mas fácil y recomendado es aprender a usar la herramienta [Make](https://www.gnu.org/software/make/) de GNU, así no tendrías que escribir en la terminal los comandos manualmente. – MrDave1999 Aug 30 '21 at 00:40
  • yo establa usando code runner para ver los resultados por consola y no funciona con archivos multiples. La idea es una solucion para usar code runner – Hernán Garcia Aug 30 '21 at 00:47
  • 1
    Tal vez este [hilo](https://stackoverflow.com/questions/51720769/how-to-use-visual-studio-code-to-compile-multi-cpp-file) pueda ayudarte... Igual, insisto, aprende a usar **Make o CMake**, facilita mucho el trabajo colaborativo y las compilaciones. – MrDave1999 Aug 30 '21 at 03:51
  • ¿Responde esto a tu pregunta? [Simbolo externo sin resolver ¿Qué he hecho mal?](https://es.stackoverflow.com/questions/65557/simbolo-externo-sin-resolver-qu%c3%a9-he-hecho-mal) – Trauma Aug 30 '21 at 07:22
  • @Trauma. Yo no he olvidado declarar ninguna funcion. El tema parec estar en q vs code no puede a traves de code runner compilar y mostrar por consola el resultado. Si puede compilar varios archivos .c con sus include en main. Lo que no puede hacer es compilar/correr cuando los prototipos estan en cabecera.h y las definiciones en diversos .c. el mismo proyecto compila y se muestra por terminal en qt creator sin problema. Por lo tanto es algun tema con vs code. El tema es q me gusta trabajar con vd code – Hernán Garcia Aug 30 '21 at 11:43
  • 1
    El problema es precisamente el que te están contando. Tienes que mirar cómo configurar el entorno para que te incluya todos los archivos a la hora de enlazar – eferion Aug 30 '21 at 13:03
  • 1
    Por favor, no pongas "solucionado" y la respuesta EN la pregunta. Usa el campo _Tu respuesta_ que está abajo y pon la respuesta. O pide que quien respondió tu pregunta, ponga la respuesta. Así es imposible para otros saber que hubo alguna solución. – Alfabravo Aug 30 '21 at 18:01

1 Answers1

2

SOLUCIONADO: La cuestion era modificar los settings de Code Runner, y no los del task.json. Encontre la respuesta en GitHub por HickmanGean. Gracias!!:

In VS Code:

ctrl + ,
from the Extensions dropdown select Run Code configuration
scroll down to Executor Map and select Edit in settings.json
for the "cpp": entry, replace $fileName with *.cpp
it should look like this
"cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
Hernán Garcia
  • 1,331
  • 3
  • 12