gcc __attribute __ ((selectany)) альтернатива для Linux? - PullRequest
3 голосов
/ 28 января 2011

Я хотел бы знать, есть ли альтернатива для __attribute__((selectany)) в Linux?

Я хотел бы определить что-то вроде этого:

char * a[] = { "qwe", "zxc" };

в заголовочном файле и включите его во многие .c файлы, которые будут связаны вместе. поэтому компоновщик увидит более одного определения «а» и поэтому не будет ссылаться. Я читал об этом атрибуте (selectany), который будет использовать только первое увиденное определение «a», к сожалению, это только для MS Windows. так что вопрос: есть ли альтернативный метод в Linux?

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

Ответы [ 4 ]

4 голосов
/ 16 июня 2015

Я думаю, что вы ищете "слабый" атрибут gcc.

2 голосов
/ 28 января 2011

Во-первых, вы должны дать ему атрибут const:

char const * a[] = { "qwe", "zxc" };

изменение строковых литералов приведет к неопределенному поведению. Тогда, чтобы ответить на ваш вопрос, хотя бы частично.

Помимо подхода объявления его extern, как и в предыдущих ответах, первый, не рекомендуемый, способ продолжить это объявить ваш массив static. Затем у вас будет копия массива в каждом модуле компиляции, который использует этот массив. Если вы не хотите изменять содержимое массивов (указатели указывают на разные строки), это нормально, но немного взрывает ваш код.

Если вам просто нужно сослаться на строки в области действия функции, и у вас есть компилятор, совместимый с C99, вы можете использовать составные литералы :

#define MYARRAY ((char const*const[]){ "qwe", "zxc" })

Затем вы можете использовать readonly , как и следовало ожидать, что-то вроде MYARRAY[1], и любой приличный компилятор должен быть в состоянии оптимизировать такой доступ.

0 голосов
/ 28 января 2011

Как насчет объявления в заголовке как:

extern char * a[] = { ... }

И затем определить фактическое значение a [] только в одном файле c:

char * a[] = { ... }
0 голосов
/ 28 января 2011

Почему бы просто не объявить это в заголовке и не указать одно определение в одной единице перевода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...