#include внутри функции main () - PullRequest
3 голосов
/ 03 мая 2011

Я хотел бы знать, возможно ли, чтобы внутри функции main() из C что-то было включено.

Например, в программе Cell я определяю параметры для cache-api.h, которые позжеmain() функция, которую я хочу изменить.

Я понял, что то, что было определено с помощью #define, может быть неопределено с помощью #undef в любом месте программы, но после переопределения моих необходимых параметров я должен включить кэш-память.снова.Возможно ли это?

Как мне решить эту проблему более элегантно?Предположим, я хочу читать из основного хранилища с cache_rd(...), но типы будут отличаться во время выполнения SPU, как я могу использовать #define CACHED_TYPE struct x и #define CACHED_TYPE struct y в одной и той же программе?

Спасибо зазаранее за ответ, я надеюсь, что я ясно выражен.

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

#define и #include - это просто текстовые операции, которые выполняются во время фазы предварительной обработки, которая технически является необязательной. Таким образом, вы можете смешивать и сопоставлять их различными способами, и если ваш синтаксис препроцессора правильный, он будет работать.

Однако, если вы переопределите макросы с помощью #undef, ваш код будет трудно отследить, потому что один и тот же текст может иметь разные значения в разных местах кода.

Для пользовательских типов typedef гораздо предпочтительнее, когда это возможно, потому что вы все еще можете воспользоваться механизмом проверки типов компилятора, и он менее подвержен ошибкам, потому что гораздо реже, чем #define макросы, иметь неожиданные побочные эффекты. влияние на окружающий код.

2 голосов
/ 03 мая 2011

Да, это нормально (может быть, это не самое ясное дизайнерское решение), но #include - это просто копирование и вставка этого файла в код в том месте, где находится #include.

1 голос
/ 03 мая 2011

#define и #include - макросы препроцессора: http://en.wikipedia.org/wiki/C_preprocessor

Они преобразованы / встроены перед компиляцией.

Чтобы ответить на ваш вопрос ... нет, вы действительно не хотели бы делать это, по крайней мере, ради следующего парня, который должен попытаться разобраться в этом беспорядке.

0 голосов
/ 03 мая 2011

Вы можете #include любой файл в любой файл. Будет ли он действительным, зависит от содержимого файла; в частности, будет ли этот контент действительным, если он будет введен непосредственно в виде текста.

Заголовочные файлы, как правило, содержат объявления и конструкции, которые обычно допустимы только вне определения функции (или вне любого вида конструкции кодирования) - ключ находится в имени header file. В противном случае вы можете изменить область объявлений или еще больше сделать синтаксически недопустимым модуль компиляции.

Подходящий файл, написанный специально для этой цели, может подойти, но не любой произвольный заголовочный файл.

В заголовочных файлах общего назначения должны быть предусмотрены средства защиты для предотвращения многократного объявления, поэтому, если вы не определите макрос защиты, повторное включение файла заголовка ни в коем случае не повлияет.

Одним из возможных решений вашей проблемы является создание отдельно скомпилированных модулей (модулей компиляции), содержащих функции-оболочки для API, который вам нужно вызывать. Каждый модуль компиляции может затем включать файл заголовка API после определения соответствующих макросов конфигурации. После этого у вас будет два отдельных и независимых интерфейса, предоставляемых этими функциями оболочки.

...