Объединение определения препроцессора и строки для создания пути #include - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь объединить путь к файлу заголовка, используя определение препроцессора (в данном случае путь проекта) и имя файла, но я постоянно получаю следующее: «предупреждение C4067: неожиданные токены следуют директиве препроцессора -ожидал новой строки ".Я пробовал следующие подходы:

#define RESOURCE_PATH PROJECT_DIRECTORY "resource.h"
#include RESOURCE_PATH

и:

#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY RESOURCE_FILE
#include RESOURCE_PATH

Оба предупреждения о выходе C4067 на линии #include.Я также попытался:

#define RESOURCE_FILE "resource.h"
#define RESOURCE_PATH PROJECT_DIRECTORY ## RESOURCE_FILE
#include RESOURCE_PATH

, который также не работает, но изменяет ошибку на «ошибка C2006:« #include »: ожидается имя файла, найден« идентификатор »».

Iдважды проверил, что мой исходный файл - UTF-8, поэтому я не случайно включил символы Unicode.PROJECT_DIRECTORY выглядит правильно отформатированным и является правильным путем.

Я использую VS2015.

Любые идеи будут оценены!

1 Ответ

0 голосов
/ 06 июня 2018

Есть две вещи, которые вызывают вашу проблему.

  1. Вы пытаетесь превратить "A" "B" в "AB".
  2. #include "A""B" - недопустимый синтаксис.

Что вы можете сделать, это объединить A и B, а затем превратить это в строковый литерал.

#define STR_IMPL(A) #A
#define STR(A) STR_IMPL(A)

Затем вы можете сделать это:

#define RESOURCE_FILE resource.h
#define PROJECT_DIRECTORY /foo/bar
#define RESOURCE_PATH STR(PROJECT_DIRECTORY/RESOURCE_FILE)

#include RESOURCE_PATH

К сожалению, в препроцессоре C ++ нет способа превратить "A" в A или "A""B" в "AB".Таким образом, вы должны работать с токенами без кавычек и в конце приводить результат в соответствие.

...