microsoft / microsoft/vscode-cpptools

Issue with includes when they are defined by preprocessor macros

Abierto
#5,261 8 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug Language Service verified
Lenguaje dominante
TypeScript
Estrellas
6.2k
Forks
1.7k
Merge medio
14 h 46 min
PR fusionados (30 d)
61

Descripción

Type: LanguageService

Describe the bug

  • OS and Version: Windows 10 1909, 18363.752
  • VS Code Version: 1.43.2 user setup
  • C/C++ Extension Version: 0.27.0
  • Other extensions you installed (and if the issue persists after disabling them):
  • Does this issue involve using SSH remote to run the extension on a remote machine?:
  • When I use the preprocessor to define a header to include, and that header file is in a different folder, Intellisense seems unable to find it, even though said folder is correctly included in the C/C++ config file

Steps to reproduce

I attach a zip file with a workspace where the issue can be reproduced. It's the bare minimum to make it appear. It contains a base folder with one .c (main.c) file and two headers (header1.h and header2.h), and a subfolder with another .c file (anotherfile.c), where the issue is present. New folder.zip
Project
├── main.c
├── header1.h
└── header2.h
. └── Test
. └── anotherFile.c

  1. Create a header in a folder (header1.h)
  2. Create a .c file in a different folder (anotherFile.c in Test)
  3. AnotherFile.c must have an include determined by a preprocessor directive: #include HEADER_NAME
  4. Use the C/C++ Properties file to give a value to that preprocessor Macro: "HEADER_NAME=\"header1.h\""
  5. See additional context to see on which situations the issue is fixed.

Expected behavior

As header1.h is in my includePath, I expect it to find header1.h

Logs
-------- Diagnostics - 07/04/2020, 11:24:20
Version: 0.27.0
Current Configuration:
{
    "name": "Win32",
    "includePath": [
        "${workspaceFolder}/**"
    ],
    "defines": [
        "_DEBUG",
        "UNICODE",
        "_UNICODE",
        "HEADER_NAME=header1.h"
    ],
    "windowsSdkVersion": "10.0.17763.0",
    "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
    "cppStandard": "c++17",
    "intelliSenseMode": "msvc-x64",
    "compilerArgs": [],
    "cStandard": "c99",
    "browse": {
        "path": [
            "${workspaceFolder}/**"
        ],
        "limitSymbolsToIncludedHeaders": true
    }
}
Translation Unit Mappings:
[ C:\Users\joel.santos\New folder\test\anotherfile.c ]:
    C:\USERS\JOEL.SANTOS\NEW FOLDER\TEST\ANOTHERFILE.C
Translation Unit Configurations:
[ C:\Users\joel.santos\New folder\test\anotherfile.c ]:
    Process ID: 26344
    Memory Usage: 11 MB
    Compiler Path: C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe
    Includes:
        C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\BUILDTOOLS\VC\TOOLS\MSVC\14.16.27023\INCLUDE
        C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.17763.0\UM
        C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.17763.0\UCRT
        C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.17763.0\SHARED
        C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.17763.0\WINRT
        C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.17763.0\CPPWINRT
        C:\USERS\JOEL.SANTOS\NEW FOLDER
    Defines:
        _DEBUG
        UNICODE
        _UNICODE
        HEADER_NAME=header1.h
    Standard Version: c99
    IntelliSense Mode: msvc-x64
Total Memory Usage: 11 MB

Screenshots

Additional context

There are a number of situations where the issue disappears. For example, if I include another header on the same directory than the one that "can't be found", Intellisense can find the header. See anotherFile.c, there's a commented include. If that line is uncommented, Intellisense can find header1.h

Also, if I define the relative path to the header in the macro, Intellisense can find the header:

"defines": [
                [...]
                "HEADER_NAME=\"..\header1.h\""    //This works
                [...]
            ],

My c_cpp_properties.json:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "HEADER_NAME=\"header1.h\""
            ],
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64"
        }
    ],
    "version": 4
}

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Reproduce el problema usando main.c, header1.h, header2.h, Test/anotherFile.c y el c_cpp_properties.json o espacio de trabajo ZIP proporcionado. Comienza ejecutando C/C++: Log Diagnostics y compara los casos de include expandidos por macros con y sin la ruta relativa. Se considera terminado cuando IntelliSense resuelve header1.h desde includePath al expandirse HEADER_NAME a su nombre.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
c, cpp, typescript, vscode
Área
devtools, tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
38/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.